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

peres001 at users.sourceforge.net peres001 at users.sourceforge.net
Fri Jul 27 21:02:19 CEST 2007


Revision: 28246
          http://scummvm.svn.sourceforge.net/scummvm/?rev=28246&view=rev
Author:   peres001
Date:     2007-07-27 12:02:19 -0700 (Fri, 27 Jul 2007)

Log Message:
-----------
- Moved disk code for Nippon Safes in new file disk_ns.cpp, adding _ns suffix to classes and member functions.
- Added function stubs into new file disk_br.cpp for Big Red Adventure [IT STILL CRASHES!].
- Modified engine to create the proper Disk manager object.

Modified Paths:
--------------
    scummvm/trunk/engines/parallaction/disk.h
    scummvm/trunk/engines/parallaction/font.cpp
    scummvm/trunk/engines/parallaction/module.mk
    scummvm/trunk/engines/parallaction/parallaction.cpp
    scummvm/trunk/engines/parallaction/walk.cpp

Added Paths:
-----------
    scummvm/trunk/engines/parallaction/disk_br.cpp
    scummvm/trunk/engines/parallaction/disk_ns.cpp

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

Deleted: scummvm/trunk/engines/parallaction/disk.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/disk.cpp	2007-07-27 18:36:50 UTC (rev 28245)
+++ scummvm/trunk/engines/parallaction/disk.cpp	2007-07-27 19:02:19 UTC (rev 28246)
@@ -1,1441 +0,0 @@
-/* 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.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "common/stdafx.h"
-
-#include "graphics/iff.h"
-#include "graphics/surface.h"
-
-#include "parallaction/parallaction.h"
-
-
-namespace Audio {
-	AudioStream *make8SVXStream(Common::ReadStream &input);
-}
-
-namespace Parallaction {
-
-
-//  HACK: Several archives ('de', 'en', 'fr' and 'disk0') in the multi-lingual
-//  Amiga version of Nippon Safes, and one archive ('fr') in the Amiga Demo of
-//  Nippon Safes used different internal offsets than all the other archives.
-//
-//  When an archive is opened in the Amiga demo, its size is checked against
-//  SIZEOF_SMALL_ARCHIVE to detect when the smaller archive is used.
-//
-//  When an archive is opened in Amiga multi-lingual version, the header is
-//  checked again NDOS to detect when a smaller archive is used.
-//
-#define SIZEOF_SMALL_ARCHIVE      	12778
-
-#define ARCHIVE_FILENAMES_OFS		0x16
-
-#define NORMAL_ARCHIVE_FILES_NUM	384
-#define SMALL_ARCHIVE_FILES_NUM		180
-
-#define NORMAL_ARCHIVE_SIZES_OFS	0x3016
-#define SMALL_ARCHIVE_SIZES_OFS		0x1696
-
-#define NORMAL_ARCHIVE_DATA_OFS		0x4000
-#define SMALL_ARCHIVE_DATA_OFS		0x1966
-
-Archive::Archive() {
-	resetArchivedFile();
-}
-
-void Archive::open(const char *file) {
-	debugC(1, kDebugDisk, "Archive::open(%s)", file);
-
-	if (_archive.isOpen())
-		close();
-
-	char	path[PATH_LEN];
-
-	strcpy(path, file);
-	if (!_archive.open(path))
-		error("archive '%s' not found", path);
-
-	_archiveName = file;
-
-	bool isSmallArchive = false;
-	if (_vm->getPlatform() == Common::kPlatformAmiga) {
-		if (_vm->getFeatures() & GF_DEMO) {
-			isSmallArchive = _archive.size() == SIZEOF_SMALL_ARCHIVE;
-		} else if (_vm->getFeatures() & GF_LANG_MULT) {
-			isSmallArchive = (_archive.readUint32BE() != MKID_BE('NDOS'));
-		}
-	}
-
-	_numFiles = (isSmallArchive) ? SMALL_ARCHIVE_FILES_NUM : NORMAL_ARCHIVE_FILES_NUM;
-
-	_archive.seek(ARCHIVE_FILENAMES_OFS);
-	_archive.read(_archiveDir, _numFiles*32);
-
-	_archive.seek((isSmallArchive) ? SMALL_ARCHIVE_SIZES_OFS : NORMAL_ARCHIVE_SIZES_OFS);
-
-	uint32 dataOffset = (isSmallArchive) ? SMALL_ARCHIVE_DATA_OFS : NORMAL_ARCHIVE_DATA_OFS;
-	for (uint16 i = 0; i < _numFiles; i++) {
-		_archiveOffsets[i] = dataOffset;
-		_archiveLenghts[i] = _archive.readUint32BE();
-		dataOffset += _archiveLenghts[i];
-	}
-
-	return;
-}
-
-
-void Archive::close() {
-	if (!_archive.isOpen()) return;
-
-	resetArchivedFile();
-
-	_archive.close();
-	_archiveName.clear();
-}
-
-Common::String Archive::name() const {
-	return _archiveName;
-}
-
-bool Archive::openArchivedFile(const char *filename) {
-	debugC(3, kDebugDisk, "Archive::openArchivedFile(%s)", filename);
-
-	resetArchivedFile();
-
-	debugC(3, kDebugDisk, "Archive::openArchivedFile(%s)", filename);
-
-	if (!_archive.isOpen())
-		error("Archive::openArchivedFile: the archive is not open");
-
-	uint16 i = 0;
-	for ( ; i < _numFiles; i++) {
-		if (!scumm_stricmp(_archiveDir[i], filename)) break;
-	}
-	if (i == _numFiles) return false;
-
-	debugC(9, kDebugDisk, "Archive::openArchivedFile: '%s' found in slot %i", filename, i);
-
-	_file = true;
-
-	_fileOffset = _archiveOffsets[i];
-	_fileCursor = _archiveOffsets[i];
-	_fileEndOffset = _archiveOffsets[i] + _archiveLenghts[i];
-
-	_archive.seek(_fileOffset);
-
-	return true;
-}
-
-void Archive::resetArchivedFile() {
-	_file = false;
-	_fileCursor = 0;
-	_fileOffset = 0;
-	_fileEndOffset = 0;
-}
-
-void Archive::closeArchivedFile() {
-	resetArchivedFile();
-}
-
-
-uint32 Archive::size() const {
-	return (_file == true ? _fileEndOffset - _fileOffset : 0);
-}
-
-uint32 Archive::pos() const {
-	return (_file == true ? _fileCursor - _fileOffset : 0 );
-}
-
-bool Archive::eos() const {
-	return (_file == true ? _fileCursor == _fileEndOffset : true );
-}
-
-void Archive::seek(int32 offs, int whence) {
-	assert(_file == true && _fileCursor <= _fileEndOffset);
-
-	switch (whence) {
-	case SEEK_CUR:
-		_fileCursor += offs;
-		break;
-	case SEEK_SET:
-		_fileCursor = _fileOffset + offs;
-		break;
-	case SEEK_END:
-		_fileCursor = _fileEndOffset - offs;
-		break;
-	}
-	assert(_fileCursor <= _fileEndOffset && _fileCursor >= _fileOffset);
-
-	_archive.seek(_fileCursor, SEEK_SET);
-}
-
-uint32 Archive::read(void *dataPtr, uint32 dataSize) {
-//	printf("read(%i, %i)\n", file->_cursor, file->_endOffset);
-	if (_file == false)
-		error("Archive::read: no archived file is currently open");
-
-	if (_fileCursor >= _fileEndOffset)
-		error("can't read beyond end of archived file");
-
-	if (_fileEndOffset - _fileCursor < dataSize)
-		dataSize = _fileEndOffset - _fileCursor;
-
-	int32 readBytes = _archive.read(dataPtr, dataSize);
-	_fileCursor += readBytes;
-
-	return readBytes;
-}
-
-
-
-
-
-/*
-	This stream class is just a wrapper around Archive, so
-	deallocation is not a problem. In fact, this class doesn't
-	delete its input (Archive) stream.
-*/
-class DummyArchiveStream : public Common::SeekableReadStream {
-
-	Archive *_input;
-
-public:
-	DummyArchiveStream(Archive &input) : _input(&input) {
-
-	}
-
-	~DummyArchiveStream() {
-		// this class exists to provide this empty destructor
-	}
-
-	bool eos() const {
-		return _input->eos();
-	}
-
-	uint32 read(void* data, uint32 dataSize) {
-		return _input->read(data, dataSize);
-	}
-
-	uint32 pos() const {
-		return _input->pos();
-	}
-
-	uint32 size() const {
-		return _input->size();
-	}
-
-	void seek(int32 offset, int whence) {
-		_input->seek(offset, whence);
-	}
-
-};
-
-
-
-Disk::Disk(Parallaction *vm) : _vm(vm) {
-
-}
-
-Disk::~Disk() {
-
-}
-
-void Disk::errorFileNotFound(const char *s) {
-	error("File '%s' not found", s);
-}
-
-
-Common::String Disk::selectArchive(const Common::String& name) {
-	Common::String oldName = _resArchive.name();
-	_resArchive.open(name.c_str());
-	return oldName;
-}
-
-void Disk::setLanguage(uint16 language) {
-	debugC(1, kDebugDisk, "setLanguage(%i)", language);
-
-	switch (language) {
-	case 0:
-		strcpy(_languageDir, "it/");
-		break;
-
-	case 1:
-		strcpy(_languageDir, "fr/");
-		break;
-
-	case 2:
-		strcpy(_languageDir, "en/");
-		break;
-
-	case 3:
-		strcpy(_languageDir, "ge/");
-		break;
-
-	default:
-		error("unknown language");
-
-	}
-
-	_languageDir[2] = '\0';
-	_locArchive.open(_languageDir);
-	_languageDir[2] = '/';
-
-	return;
-}
-
-#pragma mark -
-
-
-
-DosDisk::DosDisk(Parallaction* vm) : Disk(vm) {
-
-}
-
-DosDisk::~DosDisk() {
-}
-
-
-//
-// loads a cnv from an external file
-//
-Cnv* DosDisk::loadExternalCnv(const char *filename) {
-//	printf("Gfx::loadExternalCnv(%s)...", filename);
-
-	char path[PATH_LEN];
-
-	sprintf(path, "%s.cnv", filename);
-
-	Common::File stream;
-
-	if (!stream.open(path))
-		errorFileNotFound(path);
-
-	uint16 numFrames = stream.readByte();
-	uint16 width = stream.readByte();
-	uint16 height = stream.readByte();
-
-	uint32 decsize = numFrames * width * height;
-	byte *data = (byte*)malloc(decsize);
-	stream.read(data, decsize);
-
-	return new Cnv(numFrames, width, height, data);
-}
-
-StaticCnv *DosDisk::loadExternalStaticCnv(const char *filename) {
-
-	char path[PATH_LEN];
-
-	sprintf(path, "%s.cnv", filename);
-
-	Common::File stream;
-
-	if (!stream.open(path))
-		errorFileNotFound(path);
-
-	StaticCnv *cnv = new StaticCnv;
-
-	stream.skip(1);
-	cnv->_width = stream.readByte();
-	cnv->_height = stream.readByte();
-
-	uint16 size = cnv->_width*cnv->_height;
-
-	cnv->_data0 = (byte*)malloc(size);
-	stream.read(cnv->_data0, size);
-
-	return cnv;
-}
-
-Cnv* DosDisk::loadCnv(const char *filename) {
-//	printf("Gfx::loadCnv(%s)\n", filename);
-
-	char path[PATH_LEN];
-
-	strcpy(path, filename);
-	if (!_resArchive.openArchivedFile(path)) {
-		sprintf(path, "%s.pp", filename);
-		if (!_resArchive.openArchivedFile(path))
-			errorFileNotFound(path);
-	}
-
-	uint16 numFrames = _resArchive.readByte();
-	uint16 width = _resArchive.readByte();
-	uint16 height = _resArchive.readByte();
-
-	uint32 decsize = numFrames * width * height;
-	byte *data = (byte*)malloc(decsize);
-
-	Graphics::PackBitsReadStream decoder(_resArchive);
-	decoder.read(data, decsize);
-
-	return new Cnv(numFrames, width, height, data);
-}
-
-Cnv* DosDisk::loadTalk(const char *name) {
-
-	const char *ext = strstr(name, ".talk");
-	if (ext != NULL) {
-		// npc talk
-		return loadCnv(name);
-
-	}
-
-	// character talk
-	char v20[PATH_LEN];
-	char *v24 = const_cast<char*>(name);
-	if (IS_MINI_CHARACTER(v24)) {
-		v24+=4;
-	}
-
-	if (_engineFlags & kEngineTransformedDonna) {
-		sprintf(v20, "%stta", v24);
-	} else {
-		sprintf(v20, "%stal", v24);
-	}
-
-	return loadExternalCnv(v20);
-}
-
-Script* DosDisk::loadLocation(const char *name) {
-
-	char archivefile[PATH_LEN];
-
-	if (IS_MINI_CHARACTER(_vm->_characterName)) {
-		sprintf(archivefile, "%s%s", _vm->_characterName+4, _languageDir);
-	} else {
-		if (IS_DUMMY_CHARACTER(_vm->_characterName)) {
-			strcpy(archivefile, _languageDir);
-		} else {
-			sprintf(archivefile, "%s%s", _vm->_characterName, _languageDir);
-		}
-	}
-
-	strcat(archivefile, name);
-	strcat(archivefile, ".loc");
-
-	debugC(3, kDebugDisk, "DosDisk::loadLocation(%s): trying '%s'", name, archivefile);
-
-	if (!_locArchive.openArchivedFile(archivefile)) {
-		sprintf(archivefile, "%s%s.loc", _languageDir, name);
-		debugC(3, kDebugDisk, "DosDisk::loadLocation(%s): trying '%s'", name, archivefile);
-
-		if (!_locArchive.openArchivedFile(archivefile))
-			errorFileNotFound(name);
-	}
-
-	return new Script(new DummyArchiveStream(_locArchive), true);
-}
-
-Script* DosDisk::loadScript(const char* name) {
-
-	char vC8[PATH_LEN];
-
-	sprintf(vC8, "%s.script", name);
-
-	if (!_resArchive.openArchivedFile(vC8))
-		errorFileNotFound(vC8);
-
-	return new Script(new DummyArchiveStream(_resArchive), true);
-}
-
-StaticCnv* DosDisk::loadHead(const char* name) {
-
-	char path[PATH_LEN];
-
-	if (IS_MINI_CHARACTER(name)) {
-		name += 4;
-	}
-
-	sprintf(path, "%shead", name);
-	path[8] = '\0';
-
-	return loadExternalStaticCnv(path);
-}
-
-
-StaticCnv* DosDisk::loadPointer() {
-	return loadExternalStaticCnv("pointer");
-}
-
-
-Font* DosDisk::loadFont(const char* name) {
-	char path[PATH_LEN];
-	sprintf(path, "%scnv", name);
-	return createFont(name, loadExternalCnv(path));
-}
-
-
-Cnv* DosDisk::loadObjects(const char *name) {
-
-	if (IS_MINI_CHARACTER(name)) {
-		name += 4;
-	}
-
-	char path[PATH_LEN];
-	sprintf(path, "%sobj", name);
-	return loadExternalCnv(path);
-}
-
-
-StaticCnv* DosDisk::loadStatic(const char* name) {
-
-	char path[PATH_LEN];
-
-	strcpy(path, name);
-	if (!_resArchive.openArchivedFile(path)) {
-		sprintf(path, "%s.pp", name);
-		if (!_resArchive.openArchivedFile(path))
-			errorFileNotFound(path);
-	}
-
-	StaticCnv* cnv = new StaticCnv;
-
-	_resArchive.skip(1);
-	cnv->_width = _resArchive.readByte();
-	cnv->_height = _resArchive.readByte();
-
-	uint16 size = cnv->_width*cnv->_height;
-	cnv->_data0 = (byte*)malloc(size);
-
-	Graphics::PackBitsReadStream decoder(_resArchive);
-	decoder.read(cnv->_data0, size);
-
-	return cnv;
-}
-
-Cnv* DosDisk::loadFrames(const char* name) {
-	return loadCnv(name);
-}
-
-//
-//	slides (background images) are stored compressed by scanline in a rle fashion
-//
-//	the uncompressed data must then be unpacked to get:
-//	* color data [bits 0-5]
-//	* mask data [bits 6-7] (z buffer)
-//	* path data [bit 8] (walkable areas)
-//
-void DosDisk::unpackBackground(Common::ReadStream *stream, byte *screen, byte *mask, byte *path) {
-
-	byte b;
-	uint32 i = 0;
-
-	while (!stream->eos()) {
-		b = stream->readByte();
-
-		path[i/8] |= ((b & 0x80) >> 7) << (i & 7);
-		mask[i/4] |= ((b & 0x60) >> 5) << ((i & 3) << 1);
-		screen[i] = b & 0x1F;
-		i++;
-	}
-
-	return;
-}
-
-
-void DosDisk::parseDepths(Common::SeekableReadStream &stream) {
-	_vm->_gfx->_bgLayers[0] = stream.readByte();
-	_vm->_gfx->_bgLayers[1] = stream.readByte();
-	_vm->_gfx->_bgLayers[2] = stream.readByte();
-	_vm->_gfx->_bgLayers[3] = stream.readByte();
-}
-
-
-void DosDisk::parseBackground(Common::SeekableReadStream &stream) {
-
-	stream.read(_vm->_gfx->_palette, BASE_PALETTE_SIZE);
-	_vm->_gfx->setPalette(_vm->_gfx->_palette);
-
-	parseDepths(stream);
-
-	for (uint32 _si = 0; _si < 6; _si++) {
-		_vm->_gfx->_palettefx[_si]._timer = stream.readUint16BE();
-		_vm->_gfx->_palettefx[_si]._step = stream.readUint16BE();
-		_vm->_gfx->_palettefx[_si]._flags = stream.readUint16BE();
-		_vm->_gfx->_palettefx[_si]._first = stream.readByte();
-		_vm->_gfx->_palettefx[_si]._last = stream.readByte();
-	}
-
-}
-
-void DosDisk::loadBackground(const char *filename) {
-
-	if (!_resArchive.openArchivedFile(filename))
-		errorFileNotFound(filename);
-
-	parseBackground(_resArchive);
-
-	byte *bg = (byte*)calloc(1, _vm->_screenSize);
-	byte *mask = (byte*)calloc(1, _vm->_screenMaskSize);
-	byte *path = (byte*)calloc(1, _vm->_screenPathSize);
-
-
-	Graphics::PackBitsReadStream stream(_resArchive);
-	unpackBackground(&stream, bg, mask, path);
-
-	_vm->_gfx->setBackground(bg);
-	_vm->_gfx->setMask(mask);
-	_vm->setPath(path);
-
-	free(bg);
-	free(mask);
-	free(path);
-
-	return;
-}
-
-//
-//	read background path and mask from a file
-//
-//	mask and path are normally combined (via OR) into the background picture itself
-//	read the comment on the top of this file for more
-//
-void DosDisk::loadMaskAndPath(const char *name) {
-	char path[PATH_LEN];
-	sprintf(path, "%s.msk", name);
-
-	if (!_resArchive.openArchivedFile(path))
-		errorFileNotFound(name);
-
-	byte *maskBuf = (byte*)calloc(1, _vm->_screenMaskSize);
-	byte *pathBuf = (byte*)calloc(1, _vm->_screenPathSize);
-
-	parseDepths(_resArchive);
-
-	_resArchive.read(pathBuf, _vm->_screenPathSize);
-	_resArchive.read(maskBuf, _vm->_screenMaskSize);
-
-	_vm->_gfx->setMask(maskBuf);
-	_vm->setPath(pathBuf);
-
-	return;
-}
-
-void DosDisk::loadSlide(const char *filename) {
-	char path[PATH_LEN];
-	sprintf(path, "%s.slide", filename);
-	loadBackground(path);
-}
-
-void DosDisk::loadScenery(const char *name, const char *mask) {
-	char path[PATH_LEN];
-	sprintf(path, "%s.dyn", name);
-	loadBackground(path);
-
-	if (mask != NULL) {
-		// load external masks and paths only for certain locations
-		loadMaskAndPath(mask);
-	}
-
-}
-
-Table* DosDisk::loadTable(const char* name) {
-	char path[PATH_LEN];
-	sprintf(path, "%s.tab", name);
-
-	Common::File	stream;
-	if (!stream.open(path))
-		errorFileNotFound(path);
-
-	Table *t = new Table(100);
-
-	fillBuffers(stream);
-	while (scumm_stricmp(_tokens[0], "ENDTABLE")) {
-		t->addData(_tokens[0]);
-		fillBuffers(stream);
-	}
-
-	stream.close();
-
-	return t;
-}
-
-Common::ReadStream* DosDisk::loadMusic(const char* name) {
-	char path[PATH_LEN];
-	sprintf(path, "%s.mid", name);
-
-	Common::File *stream = new Common::File;
-	if (!stream->open(path))
-		errorFileNotFound(path);
-
-	return stream;
-}
-
-
-Common::ReadStream* DosDisk::loadSound(const char* name) {
-	return NULL;
-}
-
-
-
-
-
-
-#pragma mark -
-
-
-/* the decoder presented here is taken from pplib by Stuart Caie. The
- * following statement comes from the original source.
- *
- * pplib 1.0: a simple PowerPacker decompression and decryption library
- * placed in the Public Domain on 2003-09-18 by Stuart Caie.
- */
-
-#define PP_READ_BITS(nbits, var) do {                            \
-  bit_cnt = (nbits); (var) = 0;                                  \
-  while (bits_left < bit_cnt) {                                  \
-    if (buf < src) return 0;                                     \
-    bit_buffer |= *--buf << bits_left;                           \
-    bits_left += 8;                                              \
-  }                                                              \
-  bits_left -= bit_cnt;                                          \
-  while (bit_cnt--) {                                            \
-    (var) = ((var) << 1) | (bit_buffer & 1);                     \
-    bit_buffer >>= 1;                                            \
-  }                                                              \
-} while (0)
-
-#define PP_BYTE_OUT(byte) do {                                   \
-  if (out <= dest) return 0;                                     \
-  *--out = (byte); written++;                                    \
-} while (0)
-
-
-class PowerPackerStream : public Common::SeekableReadStream {
-
-	SeekableReadStream *_stream;
-	bool				_dispose;
-
-private:
-	int ppDecrunchBuffer(byte *src, byte *dest, uint32 src_len, uint32 dest_len) {
-
-		byte *buf, *out, *dest_end, *off_lens, bits_left = 0, bit_cnt;
-		uint32 bit_buffer = 0, x, todo, offbits, offset, written = 0;
-
-		if (src == NULL || dest == NULL) return 0;
-
-		/* set up input and output pointers */
-		off_lens = src; src = &src[4];
-		buf = &src[src_len];
-
-		out = dest_end = &dest[dest_len];
-
-		/* skip the first few bits */
-		PP_READ_BITS(src[src_len + 3], x);
-
-		/* while there are input bits left */
-		while (written < dest_len) {
-			PP_READ_BITS(1, x);
-			if (x == 0) {
-				  /* bit==0: literal, then match. bit==1: just match */
-				  todo = 1; do { PP_READ_BITS(2, x); todo += x; } while (x == 3);
-				  while (todo--) { PP_READ_BITS(8, x); PP_BYTE_OUT(x); }
-
-				  /* should we end decoding on a literal, break out of the main loop */
-				  if (written == dest_len) break;
-			}
-
-			/* match: read 2 bits for initial offset bitlength / match length */
-			PP_READ_BITS(2, x);
-			offbits = off_lens[x];
-			todo = x+2;
-			if (x == 3) {
-				PP_READ_BITS(1, x);
-				if (x == 0) offbits = 7;
-				PP_READ_BITS(offbits, offset);
-				do { PP_READ_BITS(3, x); todo += x; } while (x == 7);
-			}
-			else {
-				PP_READ_BITS(offbits, offset);
-			}
-			if (&out[offset] >= dest_end) return 0; /* match_overflow */
-			while (todo--) { x = out[offset]; PP_BYTE_OUT(x); }
-		}
-
-		/* all output bytes written without error */
-		return 1;
-	}
-
-	uint16 getCrunchType(uint32 signature) {
-
-		byte eff;
-
-		switch (signature) {
-		case 0x50503230: /* PP20 */
-			eff = 4;
-			break;
-		case 0x50504C53: /* PPLS */
-			error("PPLS crunched files are not supported");
-			eff = 8;
-			break;
-		case 0x50583230: /* PX20 */
-			error("PX20 crunched files are not supported");
-			eff = 6;
-			break;
-		default:
-			eff = 0;
-
-		}
-
-		return eff;
-	}
-
-public:
-	PowerPackerStream(Common::SeekableReadStream &stream) {
-
-		_dispose = false;
-
-		uint32 signature = stream.readUint32BE();
-		if (getCrunchType(signature) == 0) {
-			stream.seek(0, SEEK_SET);
-			_stream = &stream;
-			return;
-		}
-
-		stream.seek(4, SEEK_END);
-		uint32 decrlen = stream.readUint32BE() >> 8;
-		byte *dest = (byte*)malloc(decrlen);
-
-		uint32 crlen = stream.size() - 4;
-		byte *src = (byte*)malloc(crlen);
-		stream.seek(4, SEEK_SET);
-		stream.read(src, crlen);
-
-		ppDecrunchBuffer(src, dest, crlen-8, decrlen);
-
-		free(src);
-		_stream = new Common::MemoryReadStream(dest, decrlen, true);
-		_dispose = true;
-	}
-
-	~PowerPackerStream() {
-		if (_dispose) delete _stream;
-	}
-
-	uint32 size() const {
-		return _stream->size();
-	}
-
-	uint32 pos() const {
-		return _stream->pos();
-	}
-
-	bool eos() const {
-		return _stream->eos();
-	}
-
-	void seek(int32 offs, int whence = SEEK_SET) {
-		_stream->seek(offs, whence);
-	}
-
-	uint32 read(void *dataPtr, uint32 dataSize) {
-		return _stream->read(dataPtr, dataSize);
-	}
-};
-
-
-
-
-
-AmigaDisk::AmigaDisk(Parallaction *vm) : Disk(vm) {
-
-}
-
-
-AmigaDisk::~AmigaDisk() {
-
-}
-
-#define NUM_PLANES		5
-
-/*
-	unpackFrame transforms images from 5-bitplanes format to
-	8-bit color-index mode
-*/
-void AmigaDisk::unpackFrame(byte *dst, byte *src, uint16 planeSize) {
-
-	byte s0, s1, s2, s3, s4, mask, t0, t1, t2, t3, t4;
-
-	for (uint32 j = 0; j < planeSize; j++) {
-		s0 = src[j];
-		s1 = src[j+planeSize];
-		s2 = src[j+planeSize*2];
-		s3 = src[j+planeSize*3];
-		s4 = src[j+planeSize*4];
-
-		for (uint32 k = 0; k < 8; k++) {
-			mask = 1 << (7 - k);
-			t0 = (s0 & mask ? 1 << 0 : 0);
-			t1 = (s1 & mask ? 1 << 1 : 0);
-			t2 = (s2 & mask ? 1 << 2 : 0);
-			t3 = (s3 & mask ? 1 << 3 : 0);
-			t4 = (s4 & mask ? 1 << 4 : 0);
-			*dst++ = t0 | t1 | t2 | t3 | t4;
-		}
-
-	}
-
-}
-
-/*
-	patchFrame applies DLTA data (dlta) to specified buffer (dst)
-*/
-void AmigaDisk::patchFrame(byte *dst, byte *dlta, uint16 bytesPerPlane, uint16 height) {
-
-	uint32 *dataIndex = (uint32*)dlta;
-	uint32 *ofslenIndex = (uint32*)dlta + 8;
-
-	uint16 *base = (uint16*)dlta;
-	uint16 wordsPerLine = bytesPerPlane >> 1;
-
-	for (uint j = 0; j < NUM_PLANES; j++) {
-		uint16 *dst16 = (uint16*)(dst + j * bytesPerPlane * height);
-
-		uint16 *data = base + READ_BE_UINT32(dataIndex);
-		dataIndex++;
-		uint16 *ofslen = base + READ_BE_UINT32(ofslenIndex);
-		ofslenIndex++;
-
-		while (*ofslen != 0xFFFF) {
-
-			uint16 ofs = READ_BE_UINT16(ofslen);
-			ofslen++;
-			uint16 size = READ_BE_UINT16(ofslen);
-			ofslen++;
-
-			while (size > 0) {
-				dst16[ofs] ^= *data++;
-				ofs += wordsPerLine;
-				size--;
-			}
-
-		}
-
-	}
-
-}
-
-// FIXME: no mask is loaded
-void AmigaDisk::unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 bytesPerPlane, uint16 height) {
-
-	byte *baseFrame = src;
-	byte *tempBuffer = 0;
-
-	uint16 planeSize = bytesPerPlane * height;
-
-	for (uint32 i = 0; i < numFrames; i++) {
-		if (READ_BE_UINT32(src) == MKID_BE('DLTA')) {
-
-			uint size = READ_BE_UINT32(src + 4);
-
-			if (tempBuffer == 0)
-				tempBuffer = (byte*)malloc(planeSize * NUM_PLANES);
-
-			memcpy(tempBuffer, baseFrame, planeSize * NUM_PLANES);
-
-			patchFrame(tempBuffer, src + 8, bytesPerPlane, height);
-			unpackFrame(dst, tempBuffer, planeSize);
-
-			src += (size + 8);
-			dst += planeSize * 8;
-		} else {
-			unpackFrame(dst, src, planeSize);
-			src += planeSize * NUM_PLANES;
-			dst += planeSize * 8;
-		}
-	}
-
-	if (tempBuffer)
-		free(tempBuffer);
-
-}
-
-StaticCnv* AmigaDisk::makeStaticCnv(Common::SeekableReadStream &stream) {
-
-	stream.skip(1);
-	uint16 width = stream.readByte();
-	uint16 height = stream.readByte();
-
-	assert((width & 7) == 0);
-
-	byte bytesPerPlane = width / 8;
-
-	uint32 rawsize = bytesPerPlane * NUM_PLANES * height;
-	byte *buf = (byte*)malloc(rawsize);
-	stream.read(buf, rawsize);
-
-	uint32 decsize = width * height;
-	byte *data = (byte*)calloc(decsize, 1);
-
-	unpackBitmap(data, buf, 1, bytesPerPlane, height);
-
-	free(buf);
-
-	StaticCnv *cnv = new StaticCnv();
-	cnv->_width = width;
-	cnv->_height = height;
-	cnv->_data0 = data;
-	cnv->_data1 = NULL;
-
-	return cnv;
-}
-
-Cnv* AmigaDisk::makeCnv(Common::SeekableReadStream &stream) {
-
-	uint16 numFrames = stream.readByte();
-	uint16 width = stream.readByte();
-	uint16 height = stream.readByte();
-
-	assert((width & 7) == 0);
-
-	byte bytesPerPlane = width / 8;
-
-	uint32 rawsize = numFrames * bytesPerPlane * NUM_PLANES * height;
-	byte *buf = (byte*)malloc(rawsize);
-	stream.read(buf, rawsize);
-
-	uint32 decsize = numFrames * width * height;
-	byte *data = (byte*)calloc(decsize, 1);
-
-	unpackBitmap(data, buf, numFrames, bytesPerPlane, height);
-
-	free(buf);
-
-	return new Cnv(numFrames, width, height, data);
-}
-#undef NUM_PLANES
-
-Script* AmigaDisk::loadLocation(const char *name) {
-	debugC(1, kDebugDisk, "AmigaDisk()::loadLocation '%s'", name);
-
-	char path[PATH_LEN];
-	if (IS_MINI_CHARACTER(_vm->_characterName)) {
-		sprintf(path, "%s%s%s.loc.pp", _vm->_characterName+4, _languageDir, name);
-	} else
-		sprintf(path, "%s%s%s.loc.pp", _vm->_characterName, _languageDir, name);
-
-	if (!_locArchive.openArchivedFile(path)) {
-		sprintf(path, "%s%s.loc.pp", _languageDir, name);
-		if (!_locArchive.openArchivedFile(path)) {
-			errorFileNotFound(name);
-		}
-	}
-
-	debugC(3, kDebugDisk, "location file found: %s", path);
-
-	return new Script(new PowerPackerStream(_locArchive), true);
-}
-
-Script* AmigaDisk::loadScript(const char* name) {
-	debugC(1, kDebugDisk, "AmigaDisk::loadScript '%s'", name);
-
-	char vC8[PATH_LEN];
-
-	sprintf(vC8, "%s.script", name);
-
-	if (!_resArchive.openArchivedFile(vC8))
-		errorFileNotFound(vC8);
-
-	return new Script(new DummyArchiveStream(_resArchive), true);
-}
-
-StaticCnv* AmigaDisk::loadPointer() {
-	debugC(1, kDebugDisk, "AmigaDisk::loadPointer");
-
-	Common::File stream;
-	if (!stream.open("pointer"))
-		errorFileNotFound("pointer");
-
-	return makeStaticCnv(stream);
-}
-
-StaticCnv* AmigaDisk::loadStatic(const char* name) {
-	debugC(1, kDebugDisk, "AmigaDisk::loadStatic '%s'", name);
-
-	Common::SeekableReadStream *s = openArchivedFile(name, true);
-	StaticCnv *cnv = makeStaticCnv(*s);
-
-	delete s;
-
-	return cnv;
-}
-
-Common::SeekableReadStream *AmigaDisk::openArchivedFile(const char* name, bool errorOnFileNotFound) {
-	debugC(3, kDebugDisk, "AmigaDisk::openArchivedFile(%s)", name);
-
-	if (_resArchive.openArchivedFile(name)) {
-		return new DummyArchiveStream(_resArchive);
-	}
-
-	char path[PATH_LEN];
-
-	sprintf(path, "%s.pp", name);
-	if (_resArchive.openArchivedFile(path)) {
-		return new PowerPackerStream(_resArchive);
-	}
-
-	sprintf(path, "%s.dd", name);
-	if (_resArchive.openArchivedFile(path)) {
-		return new PowerPackerStream(_resArchive);
-	}
-
-	if (errorOnFileNotFound)
-		errorFileNotFound(name);
-
-	return NULL;
-}
-
-/*
-	FIXME: mask values are not computed correctly for level 1 and 2
-
-	NOTE: this routine is only able to build masks for Nippon Safes, since mask widths are hardcoded
-	into the main loop.
-*/
-void buildMask(byte* buf) {
-
-	byte mask1[16] = { 0, 0x80, 0x20, 0xA0, 8, 0x88, 0x28, 0xA8, 2, 0x82, 0x22, 0xA2, 0xA, 0x8A, 0x2A, 0xAA };
-	byte mask0[16] = { 0, 0x40, 0x10, 0x50, 4, 0x44, 0x14, 0x54, 1, 0x41, 0x11, 0x51, 0x5, 0x45, 0x15, 0x55 };
-
-	byte plane0[40];
-	byte plane1[40];
-
-	for (int32 i = 0; i < _vm->_screenHeight; i++) {
-
-		memcpy(plane0, buf, 40);
-		memcpy(plane1, buf+40, 40);
-
-		for (uint32 j = 0; j < 40; j++) {
-			*buf++ = mask0[(plane0[j] & 0xF0) >> 4] | mask1[(plane1[j] & 0xF0) >> 4];
-			*buf++ = mask0[plane0[j] & 0xF] | mask1[plane1[j] & 0xF];
-		}
-
-	}
-}
-
-class BackgroundDecoder : public Graphics::ILBMDecoder {
-
-	PaletteFxRange *_range;
-	uint32			_i;
-
-protected:
-	void readCRNG(Common::IFFChunk &chunk) {
-		_range[_i]._timer = chunk.readUint16BE();
-		_range[_i]._step = chunk.readUint16BE();
-		_range[_i]._flags = chunk.readUint16BE();
-		_range[_i]._first = chunk.readByte();
-		_range[_i]._last = chunk.readByte();
-
-		_i++;
-	}
-
-public:
-	BackgroundDecoder(Common::ReadStream &input, Graphics::Surface &surface, byte *&colors, PaletteFxRange *range) :
-		Graphics::ILBMDecoder(input, surface, colors), _range(range), _i(0) {
-	}
-
-	void decode() {
-		Common::IFFChunk *chunk;
-		while ((chunk = nextChunk()) != 0) {
-			switch (chunk->id) {
-			case ID_BMHD:
-				readBMHD(*chunk);
-				break;
-
-			case ID_CMAP:
-				readCMAP(*chunk);
-				break;
-
-			case ID_BODY:
-				readBODY(*chunk);
-				break;
-
-			case ID_CRNG:
-				readCRNG(*chunk);
-				break;
-			}
-		}
-	}
-
-	uint32	getNumRanges() {
-		return _i;
-	}
-};
-
-
-void AmigaDisk::loadBackground(const char *name) {
-
-	Common::SeekableReadStream *s = openArchivedFile(name, true);
-
-	Graphics::Surface surf;
-	byte *pal;
-	BackgroundDecoder decoder(*s, surf, pal, _vm->_gfx->_palettefx);
-	decoder.decode();
-
-	for (uint32 i = 0; i < BASE_PALETTE_COLORS * 3; i++)
-		_vm->_gfx->_palette[i] = pal[i] >> 2;
-	free(pal);
-	_vm->_gfx->setPalette(_vm->_gfx->_palette);
-	_vm->_gfx->setBackground(static_cast<byte*>(surf.pixels));
-	surf.free();
-	delete s;
-
-	return;
-
-}
-
-void AmigaDisk::loadMask(const char *name) {
-
-	char path[PATH_LEN];
-	sprintf(path, "%s.mask", name);
-
-	Common::SeekableReadStream *s = openArchivedFile(path, false);
-	if (s == NULL)
-		return;	// no errors if missing mask files: not every location has one
-
-	s->seek(0x30, SEEK_SET);
-
-	byte r, g, b;
-	for (uint i = 0; i < 4; i++) {
-		r = s->readByte();
-		g = s->readByte();
-		b = s->readByte();
-
-		_vm->_gfx->_bgLayers[i] = (((r << 4) & 0xF00) | (g & 0xF0) | (b >> 4)) & 0xFF;
-
-//		printf("rgb = (%x, %x, %x) -> %x\n", r, g, b, _vm->_gfx->_bgLayers[i]);
-	}
-
-
-	s->seek(0x126, SEEK_SET);	// HACK: skipping IFF/ILBM header should be done by analysis, not magic
-	Graphics::PackBitsReadStream stream(*s);
-
-	byte *buf = (byte*)malloc(_vm->_screenMaskSize);
-	stream.read(buf, _vm->_screenMaskSize);
-	buildMask(buf);
-	_vm->_gfx->setMask(buf);
-	free(buf);
-	delete s;
-
-	return;
-}
-
-void AmigaDisk::loadPath(const char *name) {
-
-	char path[PATH_LEN];
-	sprintf(path, "%s.path", name);
-
-	Common::SeekableReadStream *s = openArchivedFile(path, false);
-	if (s == NULL)
-		return;	// no errors if missing path files: not every location has one
-
-
-	s->seek(0x120, SEEK_SET);	// HACK: skipping IFF/ILBM header should be done by analysis, not magic
-
-	Graphics::PackBitsReadStream stream(*s);
-	byte *buf = (byte*)malloc(_vm->_screenPathSize);
-	stream.read(buf, _vm->_screenPathSize);
-	_vm->setPath(buf);
-	free(buf);
-	delete s;
-
-	return;
-}
-
-void AmigaDisk::loadScenery(const char* background, const char* mask) {
-	debugC(1, kDebugDisk, "AmigaDisk::loadScenery '%s', '%s'", background, mask);
-
-	char path[PATH_LEN];
-	sprintf(path, "%s.bkgnd", background);
-
-	loadBackground(path);
-	loadMask(background);
-	loadPath(background);
-
-	return;
-}
-
-void AmigaDisk::loadSlide(const char *name) {
-	debugC(1, kDebugDisk, "AmigaDisk::loadSlide '%s'", name);
-
-	char path[PATH_LEN];
-	sprintf(path, "slides/%s", name);
-	Common::SeekableReadStream *s = openArchivedFile(path, false);
-	if (s)
-		loadBackground(path);
-	else
-		loadBackground(name);
-
-	return;
-}
-
-Cnv* AmigaDisk::loadFrames(const char* name) {
-	debugC(1, kDebugDisk, "AmigaDisk::loadFrames '%s'", name);
-
-	Common::SeekableReadStream *s;
-
-	char path[PATH_LEN];
-	sprintf(path, "anims/%s", name);
-
-	s = openArchivedFile(path, false);
-	if (!s)
-		s = openArchivedFile(name, true);
-
-	Cnv *cnv = makeCnv(*s);
-	delete s;
-
-	return cnv;
-}
-
-StaticCnv* AmigaDisk::loadHead(const char* name) {
-	debugC(1, kDebugDisk, "AmigaDisk::loadHead '%s'", name);
-
-	char path[PATH_LEN];
-	sprintf(path, "%s.head", name);
-
-	Common::SeekableReadStream *s = openArchivedFile(path, true);
-	StaticCnv *cnv = makeStaticCnv(*s);
-
-	delete s;
-
-	return cnv;
-}
-
-
-Cnv* AmigaDisk::loadObjects(const char *name) {
-	debugC(1, kDebugDisk, "AmigaDisk::loadObjects");
-
-	char path[PATH_LEN];
-	if (_vm->getFeatures() & GF_DEMO)
-		sprintf(path, "%s.objs", name);
-	else
-		sprintf(path, "objs/%s.objs", name);
-
-	Common::SeekableReadStream *s = openArchivedFile(path, true);
-
-	Cnv *cnv = makeCnv(*s);
-	delete s;
-
-	return cnv;
-}
-
-
-Cnv* AmigaDisk::loadTalk(const char *name) {
-	debugC(1, kDebugDisk, "AmigaDisk::loadTalk '%s'", name);
-
-	Common::SeekableReadStream *s;
-
-	char path[PATH_LEN];
-	if (_vm->getFeatures() & GF_DEMO)
-		sprintf(path, "%s.talk", name);
-	else
-		sprintf(path, "talk/%s.talk", name);
-
-	s = openArchivedFile(path, false);
-	if (s == NULL) {
-		s = openArchivedFile(name, true);
-	}
-
-	Cnv *cnv = makeCnv(*s);
-	delete s;
-
-	return cnv;
-}
-
-Table* AmigaDisk::loadTable(const char* name) {
-	debugC(1, kDebugDisk, "AmigaDisk::loadTable '%s'", name);
-
-	char path[PATH_LEN];
-	sprintf(path, "%s.table", name);
-
-	bool dispose = false;
-
-	Common::SeekableReadStream *stream;
-
-	if (!scumm_stricmp(name, "global")) {
-		Common::File *s = new Common::File;
-		if (!s->open(path))
-			errorFileNotFound(path);
-
-		dispose = true;
-		stream = s;
-	} else {
-		if (!(_vm->getFeatures() & GF_DEMO))
-			sprintf(path, "objs/%s.table", name);
-		if (!_resArchive.openArchivedFile(path))
-			errorFileNotFound(path);
-
-		stream = &_resArchive;
-	}
-
-	Table *t = new Table(100);
-
-	fillBuffers(*stream);
-	while (scumm_stricmp(_tokens[0], "ENDTABLE")) {
-		t->addData(_tokens[0]);
-		fillBuffers(*stream);
-	}
-
-	if (dispose)
-		delete stream;
-
-	return t;
-}
-
-Font* AmigaDisk::loadFont(const char* name) {
-	debugC(1, kDebugDisk, "AmigaFullDisk::loadFont '%s'", name);
-
-	char path[PATH_LEN];
-	sprintf(path, "%sfont", name);
-
-	if (_vm->getFeatures() & GF_LANG_IT) {
-		// Italian version has separate font files
-		Common::File stream;
-		if (!stream.open(path))
-			errorFileNotFound(path);
-
-		return createFont(name, stream);
-	} else {
-		if (!_resArchive.openArchivedFile(path))
-			errorFileNotFound(path);
-
-		return createFont(name, _resArchive);
-	}
-}
-
-
-Common::ReadStream* AmigaDisk::loadMusic(const char* name) {
-	return openArchivedFile(name);
-}
-
-Common::ReadStream* AmigaDisk::loadSound(const char* name) {
-	char path[PATH_LEN];
-	sprintf(path, "%s.snd", name);
-
-	openArchivedFile(path);
-
-	return new DummyArchiveStream(_resArchive);
-}
-
-} // namespace Parallaction

Modified: scummvm/trunk/engines/parallaction/disk.h
===================================================================
--- scummvm/trunk/engines/parallaction/disk.h	2007-07-27 18:36:50 UTC (rev 28245)
+++ scummvm/trunk/engines/parallaction/disk.h	2007-07-27 19:02:19 UTC (rev 28246)
@@ -29,19 +29,8 @@
 #include "parallaction/defs.h"
 #include "common/file.h"
 
-namespace Audio {
-	class AudioStream;
-}
-
 namespace Parallaction {
 
-//------------------------------------------------------
-//		ARCHIVE MANAGEMENT
-//------------------------------------------------------
-
-
-#define MAX_ARCHIVE_ENTRIES 		384
-
 class Table;
 class Parallaction;
 class Gfx;
@@ -51,22 +40,49 @@
 struct Cnv;
 struct StaticCnv;
 
+
+class Disk {
+
+public:
+	Disk() { }
+	virtual ~Disk() { }
+
+	virtual Common::String selectArchive(const Common::String &name) = 0;
+	virtual void setLanguage(uint16 language) = 0;
+
+	virtual Script* loadLocation(const char *name) = 0;
+	virtual Script* loadScript(const char* name) = 0;
+	virtual Cnv* loadTalk(const char *name) = 0;
+	virtual Cnv* loadObjects(const char *name) = 0;
+	virtual StaticCnv* loadPointer() = 0;
+	virtual StaticCnv* loadHead(const char* name) = 0;
+	virtual Font* loadFont(const char* name) = 0;
+	virtual StaticCnv* loadStatic(const char* name) = 0;
+	virtual Cnv* loadFrames(const char* name) = 0;
+	virtual void loadSlide(const char *filename) = 0;
+	virtual void loadScenery(const char* background, const char* mask) = 0;
+	virtual Table* loadTable(const char* name) = 0;
+	virtual Common::ReadStream* loadMusic(const char* name) = 0;
+	virtual Common::ReadStream* loadSound(const char* name) = 0;
+};
+
+
+
+
+#define MAX_ARCHIVE_ENTRIES 		384
+
 class Archive : public Common::SeekableReadStream {
 
 protected:
-
 	bool   			_file;
 	uint32			_fileOffset;
 	uint32			_fileCursor;
 	uint32			_fileEndOffset;
-
 	Common::String	_archiveName;
 	char 			_archiveDir[MAX_ARCHIVE_ENTRIES][32];
 	uint32			_archiveLenghts[MAX_ARCHIVE_ENTRIES];
 	uint32			_archiveOffsets[MAX_ARCHIVE_ENTRIES];
-
 	Common::File 	_archive;
-
 	uint32			_numFiles;
 
 protected:
@@ -77,21 +93,17 @@
 
 	void open(const char* file);
 	void close();
-
 	Common::String name() const;
-
 	bool openArchivedFile(const char *name);
 	void closeArchivedFile();
-
 	uint32 size() const;
 	uint32 pos() const;
 	bool eos() const;
 	void seek(int32 offs, int whence = SEEK_SET);
-
 	uint32 read(void *dataPtr, uint32 dataSize);
 };
 
-class Disk {
+class Disk_ns : public Disk {
 
 protected:
 	Archive			_resArchive;
@@ -103,29 +115,14 @@
 	void errorFileNotFound(const char *s);
 
 public:
-	Disk(Parallaction *vm);
-	virtual ~Disk();
+	Disk_ns(Parallaction *vm);
+	virtual ~Disk_ns();
 
 	Common::String selectArchive(const Common::String &name);
 	void setLanguage(uint16 language);
-
-	virtual Script* loadLocation(const char *name) = 0;
-	virtual Script* loadScript(const char* name) = 0;
-	virtual Cnv* loadTalk(const char *name) = 0;
-	virtual Cnv* loadObjects(const char *name) = 0;
-	virtual StaticCnv* loadPointer() = 0;
-	virtual StaticCnv* loadHead(const char* name) = 0;
-	virtual Font* loadFont(const char* name) = 0;
-	virtual StaticCnv* loadStatic(const char* name) = 0;
-	virtual Cnv* loadFrames(const char* name) = 0;
-	virtual void loadSlide(const char *filename) = 0;
-	virtual void loadScenery(const char* background, const char* mask) = 0;
-	virtual Table* loadTable(const char* name) = 0;
-	virtual Common::ReadStream* loadMusic(const char* name) = 0;
-	virtual Common::ReadStream* loadSound(const char* name) = 0;
 };
 
-class DosDisk : public Disk {
+class DosDisk_ns : public Disk_ns {
 
 private:
 	void unpackBackground(Common::ReadStream *stream, byte *screen, byte *mask, byte *path);
@@ -142,8 +139,8 @@
 	Gfx	 *_gfx;
 
 public:
-	DosDisk(Parallaction *vm);
-	virtual ~DosDisk();
+	DosDisk_ns(Parallaction *vm);
+	virtual ~DosDisk_ns();
 
 	Script* loadLocation(const char *name);
 	Script* loadScript(const char* name);
@@ -161,7 +158,7 @@
 	Common::ReadStream* loadSound(const char* name);
 };
 
-class AmigaDisk : public Disk {
+class AmigaDisk_ns : public Disk_ns {
 
 protected:
 	Cnv* makeCnv(Common::SeekableReadStream &stream);
@@ -176,8 +173,8 @@
 	void loadBackground(const char *name);
 
 public:
-	AmigaDisk(Parallaction *vm);
-	virtual ~AmigaDisk();
+	AmigaDisk_ns(Parallaction *vm);
+	virtual ~AmigaDisk_ns();
 
 	Script* loadLocation(const char *name);
 	Script* loadScript(const char* name);
@@ -195,6 +192,41 @@
 	Common::ReadStream* loadSound(const char* name);
 };
 
+
+//	for the moment DosDisk_br subclasses Disk. When Amiga support will
+//  be taken into consideration, it might be useful to add another level
+//  like we did for Nippon Safes.
+class DosDisk_br : public Disk {
+
+protected:
+	Parallaction 	*_vm;
+
+protected:
+	void errorFileNotFound(const char *s);
+
+public:
+	DosDisk_br(Parallaction *vm);
+	virtual ~DosDisk_br();
+
+	Common::String selectArchive(const Common::String &name);
+	void setLanguage(uint16 language);
+	Script* loadLocation(const char *name);
+	Script* loadScript(const char* name);
+	Cnv* loadTalk(const char *name);
+	Cnv* loadObjects(const char *name);
+	StaticCnv* loadPointer();
+	StaticCnv* loadHead(const char* name);
+	Font* loadFont(const char* name);
+	StaticCnv* loadStatic(const char* name);
+	Cnv* loadFrames(const char* name);
+	void loadSlide(const char *filename);
+	void loadScenery(const char* background, const char* mask);
+	Table* loadTable(const char* name);
+	Common::ReadStream* loadMusic(const char* name);
+	Common::ReadStream* loadSound(const char* name);
+};
+
+
 } // namespace Parallaction
 
 

Added: scummvm/trunk/engines/parallaction/disk_br.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/disk_br.cpp	                        (rev 0)
+++ scummvm/trunk/engines/parallaction/disk_br.cpp	2007-07-27 19:02:19 UTC (rev 28246)
@@ -0,0 +1,134 @@
+/* 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.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "common/stdafx.h"
+#include "parallaction/parallaction.h"
+
+
+namespace Parallaction {
+
+
+void DosDisk_br::errorFileNotFound(const char *s) {
+	error("File '%s' not found", s);
+}
+
+Common::String DosDisk_br::selectArchive(const Common::String& name) {
+	debugC(5, kDebugDisk, "DosDisk_br::selectArchive");
+	return "";
+}
+
+void DosDisk_br::setLanguage(uint16 language) {
+	debugC(5, kDebugDisk, "DosDisk_br::setLanguage");
+
+	return;
+}
+
+DosDisk_br::DosDisk_br(Parallaction* vm) : _vm(vm) {
+
+}
+
+DosDisk_br::~DosDisk_br() {
+}
+
+Cnv* DosDisk_br::loadTalk(const char *name) {
+	debugC(5, kDebugDisk, "DosDisk_br::loadTalk");
+
+	return 0;
+}
+
+Script* DosDisk_br::loadLocation(const char *name) {
+	debugC(5, kDebugDisk, "DosDisk_br::loadLocation");
+	return 0;
+}
+
+Script* DosDisk_br::loadScript(const char* name) {
+	debugC(5, kDebugDisk, "DosDisk_br::loadScript");
+	return 0;
+}
+
+//	there are no Head resources in Big Red Adventure
+StaticCnv* DosDisk_br::loadHead(const char* name) {
+	debugC(5, kDebugDisk, "DosDisk_br::loadHead");
+	return 0;
+}
+
+
+StaticCnv* DosDisk_br::loadPointer() {
+	debugC(5, kDebugDisk, "DosDisk_br::loadPointer");
+	return 0;
+}
+
+
+Font* DosDisk_br::loadFont(const char* name) {
+	debugC(5, kDebugDisk, "DosDisk_br::loadFont");
+	return 0;
+}
+
+
+Cnv* DosDisk_br::loadObjects(const char *name) {
+	debugC(5, kDebugDisk, "DosDisk_br::loadObjects");
+	return 0;
+}
+
+
+StaticCnv* DosDisk_br::loadStatic(const char* name) {
+	debugC(5, kDebugDisk, "DosDisk_br::loadStatic");
+	return 0;
+}
+
+Cnv* DosDisk_br::loadFrames(const char* name) {
+	debugC(5, kDebugDisk, "DosDisk_br::loadFrames");
+	return 0;
+}
+
+//	there are no Slide resources in Big Red Adventure
+void DosDisk_br::loadSlide(const char *filename) {
+	debugC(5, kDebugDisk, "DosDisk_br::loadSlide");
+	return;
+}
+
+void DosDisk_br::loadScenery(const char *name, const char *mask) {
+	debugC(5, kDebugDisk, "DosDisk_br::loadScenery");
+	return;
+}
+
+Table* DosDisk_br::loadTable(const char* name) {
+	debugC(5, kDebugDisk, "DosDisk_br::loadTable");
+	return 0;
+}
+
+Common::ReadStream* DosDisk_br::loadMusic(const char* name) {
+	debugC(5, kDebugDisk, "DosDisk_br::loadMusic");
+	return 0;
+}
+
+
+Common::ReadStream* DosDisk_br::loadSound(const char* name) {
+	debugC(5, kDebugDisk, "DosDisk_br::loadSound");
+	return 0;
+}
+
+
+} // namespace Parallaction


Property changes on: scummvm/trunk/engines/parallaction/disk_br.cpp
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Date Rev Author URL Id
Name: svn:eol-style
   + native

Copied: scummvm/trunk/engines/parallaction/disk_ns.cpp (from rev 28242, scummvm/trunk/engines/parallaction/disk.cpp)
===================================================================
--- scummvm/trunk/engines/parallaction/disk_ns.cpp	                        (rev 0)
+++ scummvm/trunk/engines/parallaction/disk_ns.cpp	2007-07-27 19:02:19 UTC (rev 28246)
@@ -0,0 +1,1443 @@
+/* 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.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "common/stdafx.h"
+
+#include "graphics/iff.h"
+#include "graphics/surface.h"
+
+#include "parallaction/parallaction.h"
+
+
+namespace Audio {
+	class AudioStream;
+
+	AudioStream *make8SVXStream(Common::ReadStream &input);
+}
+
+namespace Parallaction {
+
+
+//  HACK: Several archives ('de', 'en', 'fr' and 'disk0') in the multi-lingual
+//  Amiga version of Nippon Safes, and one archive ('fr') in the Amiga Demo of
+//  Nippon Safes used different internal offsets than all the other archives.
+//
+//  When an archive is opened in the Amiga demo, its size is checked against
+//  SIZEOF_SMALL_ARCHIVE to detect when the smaller archive is used.
+//
+//  When an archive is opened in Amiga multi-lingual version, the header is
+//  checked again NDOS to detect when a smaller archive is used.
+//
+#define SIZEOF_SMALL_ARCHIVE      	12778
+
+#define ARCHIVE_FILENAMES_OFS		0x16
+
+#define NORMAL_ARCHIVE_FILES_NUM	384
+#define SMALL_ARCHIVE_FILES_NUM		180
+
+#define NORMAL_ARCHIVE_SIZES_OFS	0x3016
+#define SMALL_ARCHIVE_SIZES_OFS		0x1696
+
+#define NORMAL_ARCHIVE_DATA_OFS		0x4000
+#define SMALL_ARCHIVE_DATA_OFS		0x1966
+
+Archive::Archive() {
+	resetArchivedFile();
+}
+
+void Archive::open(const char *file) {
+	debugC(1, kDebugDisk, "Archive::open(%s)", file);
+
+	if (_archive.isOpen())
+		close();
+
+	char	path[PATH_LEN];
+
+	strcpy(path, file);
+	if (!_archive.open(path))
+		error("archive '%s' not found", path);
+
+	_archiveName = file;
+
+	bool isSmallArchive = false;
+	if (_vm->getPlatform() == Common::kPlatformAmiga) {
+		if (_vm->getFeatures() & GF_DEMO) {
+			isSmallArchive = _archive.size() == SIZEOF_SMALL_ARCHIVE;
+		} else if (_vm->getFeatures() & GF_LANG_MULT) {
+			isSmallArchive = (_archive.readUint32BE() != MKID_BE('NDOS'));
+		}
+	}
+
+	_numFiles = (isSmallArchive) ? SMALL_ARCHIVE_FILES_NUM : NORMAL_ARCHIVE_FILES_NUM;
+
+	_archive.seek(ARCHIVE_FILENAMES_OFS);
+	_archive.read(_archiveDir, _numFiles*32);
+
+	_archive.seek((isSmallArchive) ? SMALL_ARCHIVE_SIZES_OFS : NORMAL_ARCHIVE_SIZES_OFS);
+
+	uint32 dataOffset = (isSmallArchive) ? SMALL_ARCHIVE_DATA_OFS : NORMAL_ARCHIVE_DATA_OFS;
+	for (uint16 i = 0; i < _numFiles; i++) {
+		_archiveOffsets[i] = dataOffset;
+		_archiveLenghts[i] = _archive.readUint32BE();
+		dataOffset += _archiveLenghts[i];
+	}
+
+	return;
+}
+
+
+void Archive::close() {
+	if (!_archive.isOpen()) return;
+
+	resetArchivedFile();
+
+	_archive.close();
+	_archiveName.clear();
+}
+
+Common::String Archive::name() const {
+	return _archiveName;
+}
+
+bool Archive::openArchivedFile(const char *filename) {
+	debugC(3, kDebugDisk, "Archive::openArchivedFile(%s)", filename);
+
+	resetArchivedFile();
+
+	debugC(3, kDebugDisk, "Archive::openArchivedFile(%s)", filename);
+
+	if (!_archive.isOpen())
+		error("Archive::openArchivedFile: the archive is not open");
+
+	uint16 i = 0;
+	for ( ; i < _numFiles; i++) {
+		if (!scumm_stricmp(_archiveDir[i], filename)) break;
+	}
+	if (i == _numFiles) return false;
+
+	debugC(9, kDebugDisk, "Archive::openArchivedFile: '%s' found in slot %i", filename, i);
+
+	_file = true;
+
+	_fileOffset = _archiveOffsets[i];
+	_fileCursor = _archiveOffsets[i];
+	_fileEndOffset = _archiveOffsets[i] + _archiveLenghts[i];
+
+	_archive.seek(_fileOffset);
+
+	return true;
+}
+
+void Archive::resetArchivedFile() {
+	_file = false;
+	_fileCursor = 0;
+	_fileOffset = 0;
+	_fileEndOffset = 0;
+}
+
+void Archive::closeArchivedFile() {
+	resetArchivedFile();
+}
+
+
+uint32 Archive::size() const {
+	return (_file == true ? _fileEndOffset - _fileOffset : 0);
+}
+
+uint32 Archive::pos() const {
+	return (_file == true ? _fileCursor - _fileOffset : 0 );
+}
+
+bool Archive::eos() const {
+	return (_file == true ? _fileCursor == _fileEndOffset : true );
+}
+
+void Archive::seek(int32 offs, int whence) {
+	assert(_file == true && _fileCursor <= _fileEndOffset);
+
+	switch (whence) {
+	case SEEK_CUR:
+		_fileCursor += offs;
+		break;
+	case SEEK_SET:
+		_fileCursor = _fileOffset + offs;
+		break;
+	case SEEK_END:
+		_fileCursor = _fileEndOffset - offs;
+		break;
+	}
+	assert(_fileCursor <= _fileEndOffset && _fileCursor >= _fileOffset);
+
+	_archive.seek(_fileCursor, SEEK_SET);
+}
+
+uint32 Archive::read(void *dataPtr, uint32 dataSize) {
+//	printf("read(%i, %i)\n", file->_cursor, file->_endOffset);
+	if (_file == false)
+		error("Archive::read: no archived file is currently open");
+
+	if (_fileCursor >= _fileEndOffset)
+		error("can't read beyond end of archived file");
+
+	if (_fileEndOffset - _fileCursor < dataSize)
+		dataSize = _fileEndOffset - _fileCursor;
+
+	int32 readBytes = _archive.read(dataPtr, dataSize);
+	_fileCursor += readBytes;
+
+	return readBytes;
+}
+
+
+
+
+
+/*
+	This stream class is just a wrapper around Archive, so
+	deallocation is not a problem. In fact, this class doesn't
+	delete its input (Archive) stream.
+*/
+class DummyArchiveStream : public Common::SeekableReadStream {
+
+	Archive *_input;
+
+public:
+	DummyArchiveStream(Archive &input) : _input(&input) {
+
+	}
+
+	~DummyArchiveStream() {
+		// this class exists to provide this empty destructor
+	}
+
+	bool eos() const {
+		return _input->eos();
+	}
+
+	uint32 read(void* data, uint32 dataSize) {
+		return _input->read(data, dataSize);
+	}
+
+	uint32 pos() const {
+		return _input->pos();
+	}
+
+	uint32 size() const {
+		return _input->size();
+	}
+
+	void seek(int32 offset, int whence) {
+		_input->seek(offset, whence);
+	}
+
+};
+
+
+
+void Disk_ns::errorFileNotFound(const char *s) {
+	error("File '%s' not found", s);
+}
+
+Disk_ns::Disk_ns(Parallaction *vm) : _vm(vm) {
+
+}
+
+Disk_ns::~Disk_ns() {
+
+}
+
+
+Common::String Disk_ns::selectArchive(const Common::String& name) {
+	Common::String oldName = _resArchive.name();
+	_resArchive.open(name.c_str());
+	return oldName;
+}
+
+void Disk_ns::setLanguage(uint16 language) {
+	debugC(1, kDebugDisk, "setLanguage(%i)", language);
+
+	switch (language) {
+	case 0:
+		strcpy(_languageDir, "it/");
+		break;
+
+	case 1:
+		strcpy(_languageDir, "fr/");
+		break;
+
+	case 2:
+		strcpy(_languageDir, "en/");
+		break;
+
+	case 3:
+		strcpy(_languageDir, "ge/");
+		break;
+
+	default:
+		error("unknown language");
+
+	}
+
+	_languageDir[2] = '\0';
+	_locArchive.open(_languageDir);
+	_languageDir[2] = '/';
+
+	return;
+}
+
+#pragma mark -
+
+
+
+DosDisk_ns::DosDisk_ns(Parallaction* vm) : Disk_ns(vm) {
+
+}
+
+DosDisk_ns::~DosDisk_ns() {
+}
+
+
+//
+// loads a cnv from an external file
+//
+Cnv* DosDisk_ns::loadExternalCnv(const char *filename) {
+//	printf("Gfx::loadExternalCnv(%s)...", filename);
+
+	char path[PATH_LEN];
+
+	sprintf(path, "%s.cnv", filename);
+
+	Common::File stream;
+
+	if (!stream.open(path))
+		errorFileNotFound(path);
+
+	uint16 numFrames = stream.readByte();
+	uint16 width = stream.readByte();
+	uint16 height = stream.readByte();
+
+	uint32 decsize = numFrames * width * height;
+	byte *data = (byte*)malloc(decsize);
+	stream.read(data, decsize);
+
+	return new Cnv(numFrames, width, height, data);
+}
+
+StaticCnv *DosDisk_ns::loadExternalStaticCnv(const char *filename) {
+
+	char path[PATH_LEN];
+
+	sprintf(path, "%s.cnv", filename);
+
+	Common::File stream;
+
+	if (!stream.open(path))
+		errorFileNotFound(path);
+
+	StaticCnv *cnv = new StaticCnv;
+
+	stream.skip(1);
+	cnv->_width = stream.readByte();
+	cnv->_height = stream.readByte();
+
+	uint16 size = cnv->_width*cnv->_height;
+
+	cnv->_data0 = (byte*)malloc(size);
+	stream.read(cnv->_data0, size);
+
+	return cnv;
+}
+
+Cnv* DosDisk_ns::loadCnv(const char *filename) {
+//	printf("Gfx::loadCnv(%s)\n", filename);
+
+	char path[PATH_LEN];
+
+	strcpy(path, filename);
+	if (!_resArchive.openArchivedFile(path)) {
+		sprintf(path, "%s.pp", filename);
+		if (!_resArchive.openArchivedFile(path))
+			errorFileNotFound(path);
+	}
+
+	uint16 numFrames = _resArchive.readByte();
+	uint16 width = _resArchive.readByte();
+	uint16 height = _resArchive.readByte();
+
+	uint32 decsize = numFrames * width * height;
+	byte *data = (byte*)malloc(decsize);
+
+	Graphics::PackBitsReadStream decoder(_resArchive);
+	decoder.read(data, decsize);
+
+	return new Cnv(numFrames, width, height, data);
+}
+
+Cnv* DosDisk_ns::loadTalk(const char *name) {
+
+	const char *ext = strstr(name, ".talk");
+	if (ext != NULL) {
+		// npc talk
+		return loadCnv(name);
+
+	}
+
+	// character talk
+	char v20[PATH_LEN];
+	char *v24 = const_cast<char*>(name);
+	if (IS_MINI_CHARACTER(v24)) {
+		v24+=4;
+	}
+
+	if (_engineFlags & kEngineTransformedDonna) {
+		sprintf(v20, "%stta", v24);
+	} else {
+		sprintf(v20, "%stal", v24);
+	}
+
+	return loadExternalCnv(v20);
+}
+
+Script* DosDisk_ns::loadLocation(const char *name) {
+
+	char archivefile[PATH_LEN];
+
+	if (IS_MINI_CHARACTER(_vm->_characterName)) {
+		sprintf(archivefile, "%s%s", _vm->_characterName+4, _languageDir);
+	} else {
+		if (IS_DUMMY_CHARACTER(_vm->_characterName)) {
+			strcpy(archivefile, _languageDir);
+		} else {
+			sprintf(archivefile, "%s%s", _vm->_characterName, _languageDir);
+		}
+	}
+
+	strcat(archivefile, name);
+	strcat(archivefile, ".loc");
+
+	debugC(3, kDebugDisk, "DosDisk_ns::loadLocation(%s): trying '%s'", name, archivefile);
+
+	if (!_locArchive.openArchivedFile(archivefile)) {
+		sprintf(archivefile, "%s%s.loc", _languageDir, name);
+		debugC(3, kDebugDisk, "DosDisk_ns::loadLocation(%s): trying '%s'", name, archivefile);
+
+		if (!_locArchive.openArchivedFile(archivefile))
+			errorFileNotFound(name);
+	}
+
+	return new Script(new DummyArchiveStream(_locArchive), true);
+}
+
+Script* DosDisk_ns::loadScript(const char* name) {
+
+	char vC8[PATH_LEN];
+
+	sprintf(vC8, "%s.script", name);
+
+	if (!_resArchive.openArchivedFile(vC8))
+		errorFileNotFound(vC8);
+
+	return new Script(new DummyArchiveStream(_resArchive), true);
+}
+
+StaticCnv* DosDisk_ns::loadHead(const char* name) {
+
+	char path[PATH_LEN];
+
+	if (IS_MINI_CHARACTER(name)) {
+		name += 4;
+	}
+
+	sprintf(path, "%shead", name);
+	path[8] = '\0';
+
+	return loadExternalStaticCnv(path);
+}
+
+
+StaticCnv* DosDisk_ns::loadPointer() {
+	return loadExternalStaticCnv("pointer");
+}
+
+
+Font* DosDisk_ns::loadFont(const char* name) {
+	char path[PATH_LEN];
+	sprintf(path, "%scnv", name);
+	return createFont(name, loadExternalCnv(path));
+}
+
+
+Cnv* DosDisk_ns::loadObjects(const char *name) {
+
+	if (IS_MINI_CHARACTER(name)) {
+		name += 4;
+	}
+
+	char path[PATH_LEN];
+	sprintf(path, "%sobj", name);
+	return loadExternalCnv(path);
+}
+
+
+StaticCnv* DosDisk_ns::loadStatic(const char* name) {
+
+	char path[PATH_LEN];
+
+	strcpy(path, name);
+	if (!_resArchive.openArchivedFile(path)) {
+		sprintf(path, "%s.pp", name);
+		if (!_resArchive.openArchivedFile(path))
+			errorFileNotFound(path);
+	}
+
+	StaticCnv* cnv = new StaticCnv;
+
+	_resArchive.skip(1);
+	cnv->_width = _resArchive.readByte();
+	cnv->_height = _resArchive.readByte();
+
+	uint16 size = cnv->_width*cnv->_height;
+	cnv->_data0 = (byte*)malloc(size);
+
+	Graphics::PackBitsReadStream decoder(_resArchive);
+	decoder.read(cnv->_data0, size);
+
+	return cnv;
+}
+
+Cnv* DosDisk_ns::loadFrames(const char* name) {
+	return loadCnv(name);
+}
+
+//
+//	slides (background images) are stored compressed by scanline in a rle fashion
+//
+//	the uncompressed data must then be unpacked to get:
+//	* color data [bits 0-5]
+//	* mask data [bits 6-7] (z buffer)
+//	* path data [bit 8] (walkable areas)
+//
+void DosDisk_ns::unpackBackground(Common::ReadStream *stream, byte *screen, byte *mask, byte *path) {
+
+	byte b;
+	uint32 i = 0;
+
+	while (!stream->eos()) {
+		b = stream->readByte();
+
+		path[i/8] |= ((b & 0x80) >> 7) << (i & 7);
+		mask[i/4] |= ((b & 0x60) >> 5) << ((i & 3) << 1);
+		screen[i] = b & 0x1F;
+		i++;
+	}
+
+	return;
+}
+
+
+void DosDisk_ns::parseDepths(Common::SeekableReadStream &stream) {
+	_vm->_gfx->_bgLayers[0] = stream.readByte();
+	_vm->_gfx->_bgLayers[1] = stream.readByte();
+	_vm->_gfx->_bgLayers[2] = stream.readByte();
+	_vm->_gfx->_bgLayers[3] = stream.readByte();
+}
+
+
+void DosDisk_ns::parseBackground(Common::SeekableReadStream &stream) {
+
+	stream.read(_vm->_gfx->_palette, BASE_PALETTE_SIZE);
+	_vm->_gfx->setPalette(_vm->_gfx->_palette);
+
+	parseDepths(stream);
+
+	for (uint32 _si = 0; _si < 6; _si++) {
+		_vm->_gfx->_palettefx[_si]._timer = stream.readUint16BE();
+		_vm->_gfx->_palettefx[_si]._step = stream.readUint16BE();
+		_vm->_gfx->_palettefx[_si]._flags = stream.readUint16BE();
+		_vm->_gfx->_palettefx[_si]._first = stream.readByte();
+		_vm->_gfx->_palettefx[_si]._last = stream.readByte();
+	}
+
+}
+
+void DosDisk_ns::loadBackground(const char *filename) {
+
+	if (!_resArchive.openArchivedFile(filename))
+		errorFileNotFound(filename);
+
+	parseBackground(_resArchive);
+
+	byte *bg = (byte*)calloc(1, _vm->_screenSize);
+	byte *mask = (byte*)calloc(1, _vm->_screenMaskSize);
+	byte *path = (byte*)calloc(1, _vm->_screenPathSize);
+
+
+	Graphics::PackBitsReadStream stream(_resArchive);
+	unpackBackground(&stream, bg, mask, path);
+
+	_vm->_gfx->setBackground(bg);
+	_vm->_gfx->setMask(mask);
+	_vm->setPath(path);
+
+	free(bg);
+	free(mask);
+	free(path);
+
+	return;
+}
+
+//
+//	read background path and mask from a file
+//
+//	mask and path are normally combined (via OR) into the background picture itself
+//	read the comment on the top of this file for more
+//
+void DosDisk_ns::loadMaskAndPath(const char *name) {
+	char path[PATH_LEN];
+	sprintf(path, "%s.msk", name);
+
+	if (!_resArchive.openArchivedFile(path))
+		errorFileNotFound(name);
+
+	byte *maskBuf = (byte*)calloc(1, _vm->_screenMaskSize);
+	byte *pathBuf = (byte*)calloc(1, _vm->_screenPathSize);
+
+	parseDepths(_resArchive);
+
+	_resArchive.read(pathBuf, _vm->_screenPathSize);
+	_resArchive.read(maskBuf, _vm->_screenMaskSize);
+
+	_vm->_gfx->setMask(maskBuf);
+	_vm->setPath(pathBuf);
+
+	return;
+}
+
+void DosDisk_ns::loadSlide(const char *filename) {
+	char path[PATH_LEN];
+	sprintf(path, "%s.slide", filename);
+	loadBackground(path);
+}
+
+void DosDisk_ns::loadScenery(const char *name, const char *mask) {
+	char path[PATH_LEN];
+	sprintf(path, "%s.dyn", name);
+	loadBackground(path);
+
+	if (mask != NULL) {
+		// load external masks and paths only for certain locations
+		loadMaskAndPath(mask);
+	}
+
+}
+
+Table* DosDisk_ns::loadTable(const char* name) {
+	char path[PATH_LEN];
+	sprintf(path, "%s.tab", name);
+
+	Common::File	stream;
+	if (!stream.open(path))
+		errorFileNotFound(path);
+
+	Table *t = new Table(100);
+
+	fillBuffers(stream);
+	while (scumm_stricmp(_tokens[0], "ENDTABLE")) {
+		t->addData(_tokens[0]);
+		fillBuffers(stream);
+	}
+
+	stream.close();
+
+	return t;
+}
+
+Common::ReadStream* DosDisk_ns::loadMusic(const char* name) {
+	char path[PATH_LEN];
+	sprintf(path, "%s.mid", name);
+
+	Common::File *stream = new Common::File;
+	if (!stream->open(path))
+		errorFileNotFound(path);
+
+	return stream;
+}
+
+
+Common::ReadStream* DosDisk_ns::loadSound(const char* name) {
+	return NULL;
+}
+
+
+
+
+
+
+#pragma mark -
+
+
+/* the decoder presented here is taken from pplib by Stuart Caie. The
+ * following statement comes from the original source.
+ *
+ * pplib 1.0: a simple PowerPacker decompression and decryption library
+ * placed in the Public Domain on 2003-09-18 by Stuart Caie.
+ */
+
+#define PP_READ_BITS(nbits, var) do {                            \
+  bit_cnt = (nbits); (var) = 0;                                  \
+  while (bits_left < bit_cnt) {                                  \
+    if (buf < src) return 0;                                     \
+    bit_buffer |= *--buf << bits_left;                           \
+    bits_left += 8;                                              \
+  }                                                              \
+  bits_left -= bit_cnt;                                          \
+  while (bit_cnt--) {                                            \
+    (var) = ((var) << 1) | (bit_buffer & 1);                     \
+    bit_buffer >>= 1;                                            \
+  }                                                              \
+} while (0)
+
+#define PP_BYTE_OUT(byte) do {                                   \
+  if (out <= dest) return 0;                                     \
+  *--out = (byte); written++;                                    \
+} while (0)
+
+
+class PowerPackerStream : public Common::SeekableReadStream {
+
+	SeekableReadStream *_stream;
+	bool				_dispose;
+
+private:
+	int ppDecrunchBuffer(byte *src, byte *dest, uint32 src_len, uint32 dest_len) {
+
+		byte *buf, *out, *dest_end, *off_lens, bits_left = 0, bit_cnt;
+		uint32 bit_buffer = 0, x, todo, offbits, offset, written = 0;
+
+		if (src == NULL || dest == NULL) return 0;
+
+		/* set up input and output pointers */
+		off_lens = src; src = &src[4];
+		buf = &src[src_len];
+
+		out = dest_end = &dest[dest_len];
+
+		/* skip the first few bits */
+		PP_READ_BITS(src[src_len + 3], x);
+
+		/* while there are input bits left */
+		while (written < dest_len) {
+			PP_READ_BITS(1, x);
+			if (x == 0) {
+				  /* bit==0: literal, then match. bit==1: just match */
+				  todo = 1; do { PP_READ_BITS(2, x); todo += x; } while (x == 3);
+				  while (todo--) { PP_READ_BITS(8, x); PP_BYTE_OUT(x); }
+
+				  /* should we end decoding on a literal, break out of the main loop */
+				  if (written == dest_len) break;
+			}
+
+			/* match: read 2 bits for initial offset bitlength / match length */
+			PP_READ_BITS(2, x);
+			offbits = off_lens[x];
+			todo = x+2;
+			if (x == 3) {
+				PP_READ_BITS(1, x);
+				if (x == 0) offbits = 7;
+				PP_READ_BITS(offbits, offset);
+				do { PP_READ_BITS(3, x); todo += x; } while (x == 7);
+			}
+			else {
+				PP_READ_BITS(offbits, offset);
+			}
+			if (&out[offset] >= dest_end) return 0; /* match_overflow */
+			while (todo--) { x = out[offset]; PP_BYTE_OUT(x); }
+		}
+
+		/* all output bytes written without error */
+		return 1;
+	}
+
+	uint16 getCrunchType(uint32 signature) {
+
+		byte eff;
+
+		switch (signature) {
+		case 0x50503230: /* PP20 */
+			eff = 4;
+			break;
+		case 0x50504C53: /* PPLS */
+			error("PPLS crunched files are not supported");
+			eff = 8;
+			break;
+		case 0x50583230: /* PX20 */
+			error("PX20 crunched files are not supported");
+			eff = 6;
+			break;
+		default:
+			eff = 0;
+
+		}
+
+		return eff;
+	}
+
+public:
+	PowerPackerStream(Common::SeekableReadStream &stream) {
+
+		_dispose = false;
+
+		uint32 signature = stream.readUint32BE();
+		if (getCrunchType(signature) == 0) {
+			stream.seek(0, SEEK_SET);
+			_stream = &stream;
+			return;
+		}
+
+		stream.seek(4, SEEK_END);
+		uint32 decrlen = stream.readUint32BE() >> 8;
+		byte *dest = (byte*)malloc(decrlen);
+
+		uint32 crlen = stream.size() - 4;
+		byte *src = (byte*)malloc(crlen);
+		stream.seek(4, SEEK_SET);
+		stream.read(src, crlen);
+
+		ppDecrunchBuffer(src, dest, crlen-8, decrlen);
+
+		free(src);
+		_stream = new Common::MemoryReadStream(dest, decrlen, true);
+		_dispose = true;
+	}
+
+	~PowerPackerStream() {
+		if (_dispose) delete _stream;
+	}
+
+	uint32 size() const {
+		return _stream->size();
+	}
+
+	uint32 pos() const {
+		return _stream->pos();
+	}
+
+	bool eos() const {
+		return _stream->eos();
+	}
+
+	void seek(int32 offs, int whence = SEEK_SET) {
+		_stream->seek(offs, whence);
+	}
+
+	uint32 read(void *dataPtr, uint32 dataSize) {
+		return _stream->read(dataPtr, dataSize);
+	}
+};
+
+
+
+
+
+AmigaDisk_ns::AmigaDisk_ns(Parallaction *vm) : Disk_ns(vm) {
+
+}
+
+
+AmigaDisk_ns::~AmigaDisk_ns() {
+
+}
+
+#define NUM_PLANES		5
+
+/*
+	unpackFrame transforms images from 5-bitplanes format to
+	8-bit color-index mode
+*/
+void AmigaDisk_ns::unpackFrame(byte *dst, byte *src, uint16 planeSize) {
+
+	byte s0, s1, s2, s3, s4, mask, t0, t1, t2, t3, t4;
+
+	for (uint32 j = 0; j < planeSize; j++) {
+		s0 = src[j];
+		s1 = src[j+planeSize];
+		s2 = src[j+planeSize*2];
+		s3 = src[j+planeSize*3];
+		s4 = src[j+planeSize*4];
+
+		for (uint32 k = 0; k < 8; k++) {
+			mask = 1 << (7 - k);
+			t0 = (s0 & mask ? 1 << 0 : 0);
+			t1 = (s1 & mask ? 1 << 1 : 0);
+			t2 = (s2 & mask ? 1 << 2 : 0);
+			t3 = (s3 & mask ? 1 << 3 : 0);
+			t4 = (s4 & mask ? 1 << 4 : 0);
+			*dst++ = t0 | t1 | t2 | t3 | t4;
+		}
+
+	}
+
+}
+
+/*
+	patchFrame applies DLTA data (dlta) to specified buffer (dst)
+*/
+void AmigaDisk_ns::patchFrame(byte *dst, byte *dlta, uint16 bytesPerPlane, uint16 height) {
+
+	uint32 *dataIndex = (uint32*)dlta;
+	uint32 *ofslenIndex = (uint32*)dlta + 8;
+
+	uint16 *base = (uint16*)dlta;
+	uint16 wordsPerLine = bytesPerPlane >> 1;
+
+	for (uint j = 0; j < NUM_PLANES; j++) {
+		uint16 *dst16 = (uint16*)(dst + j * bytesPerPlane * height);
+
+		uint16 *data = base + READ_BE_UINT32(dataIndex);
+		dataIndex++;
+		uint16 *ofslen = base + READ_BE_UINT32(ofslenIndex);
+		ofslenIndex++;
+
+		while (*ofslen != 0xFFFF) {
+
+			uint16 ofs = READ_BE_UINT16(ofslen);
+			ofslen++;
+			uint16 size = READ_BE_UINT16(ofslen);
+			ofslen++;
+
+			while (size > 0) {
+				dst16[ofs] ^= *data++;
+				ofs += wordsPerLine;
+				size--;
+			}
+
+		}
+
+	}
+
+}
+
+// FIXME: no mask is loaded
+void AmigaDisk_ns::unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 bytesPerPlane, uint16 height) {
+
+	byte *baseFrame = src;
+	byte *tempBuffer = 0;
+
+	uint16 planeSize = bytesPerPlane * height;
+
+	for (uint32 i = 0; i < numFrames; i++) {
+		if (READ_BE_UINT32(src) == MKID_BE('DLTA')) {
+
+			uint size = READ_BE_UINT32(src + 4);
+
+			if (tempBuffer == 0)
+				tempBuffer = (byte*)malloc(planeSize * NUM_PLANES);
+
+			memcpy(tempBuffer, baseFrame, planeSize * NUM_PLANES);
+
+			patchFrame(tempBuffer, src + 8, bytesPerPlane, height);
+			unpackFrame(dst, tempBuffer, planeSize);
+
+			src += (size + 8);
+			dst += planeSize * 8;
+		} else {
+			unpackFrame(dst, src, planeSize);
+			src += planeSize * NUM_PLANES;
+			dst += planeSize * 8;
+		}
+	}
+
+	if (tempBuffer)
+		free(tempBuffer);
+
+}
+
+StaticCnv* AmigaDisk_ns::makeStaticCnv(Common::SeekableReadStream &stream) {
+
+	stream.skip(1);
+	uint16 width = stream.readByte();
+	uint16 height = stream.readByte();
+
+	assert((width & 7) == 0);
+
+	byte bytesPerPlane = width / 8;
+
+	uint32 rawsize = bytesPerPlane * NUM_PLANES * height;
+	byte *buf = (byte*)malloc(rawsize);
+	stream.read(buf, rawsize);
+
+	uint32 decsize = width * height;
+	byte *data = (byte*)calloc(decsize, 1);
+
+	unpackBitmap(data, buf, 1, bytesPerPlane, height);
+
+	free(buf);
+
+	StaticCnv *cnv = new StaticCnv();
+	cnv->_width = width;
+	cnv->_height = height;
+	cnv->_data0 = data;
+	cnv->_data1 = NULL;
+
+	return cnv;
+}
+
+Cnv* AmigaDisk_ns::makeCnv(Common::SeekableReadStream &stream) {
+
+	uint16 numFrames = stream.readByte();
+	uint16 width = stream.readByte();
+	uint16 height = stream.readByte();
+
+	assert((width & 7) == 0);
+
+	byte bytesPerPlane = width / 8;
+
+	uint32 rawsize = numFrames * bytesPerPlane * NUM_PLANES * height;
+	byte *buf = (byte*)malloc(rawsize);
+	stream.read(buf, rawsize);
+
+	uint32 decsize = numFrames * width * height;
+	byte *data = (byte*)calloc(decsize, 1);
+
+	unpackBitmap(data, buf, numFrames, bytesPerPlane, height);
+
+	free(buf);
+
+	return new Cnv(numFrames, width, height, data);
+}
+#undef NUM_PLANES
+
+Script* AmigaDisk_ns::loadLocation(const char *name) {
+	debugC(1, kDebugDisk, "AmigaDisk_ns()::loadLocation '%s'", name);
+
+	char path[PATH_LEN];
+	if (IS_MINI_CHARACTER(_vm->_characterName)) {
+		sprintf(path, "%s%s%s.loc.pp", _vm->_characterName+4, _languageDir, name);
+	} else
+		sprintf(path, "%s%s%s.loc.pp", _vm->_characterName, _languageDir, name);
+
+	if (!_locArchive.openArchivedFile(path)) {
+		sprintf(path, "%s%s.loc.pp", _languageDir, name);
+		if (!_locArchive.openArchivedFile(path)) {
+			errorFileNotFound(name);
+		}
+	}
+
+	debugC(3, kDebugDisk, "location file found: %s", path);
+
+	return new Script(new PowerPackerStream(_locArchive), true);
+}
+
+Script* AmigaDisk_ns::loadScript(const char* name) {
+	debugC(1, kDebugDisk, "AmigaDisk_ns::loadScript '%s'", name);
+
+	char vC8[PATH_LEN];
+
+	sprintf(vC8, "%s.script", name);
+
+	if (!_resArchive.openArchivedFile(vC8))
+		errorFileNotFound(vC8);
+
+	return new Script(new DummyArchiveStream(_resArchive), true);
+}
+
+StaticCnv* AmigaDisk_ns::loadPointer() {
+	debugC(1, kDebugDisk, "AmigaDisk_ns::loadPointer");
+
+	Common::File stream;
+	if (!stream.open("pointer"))
+		errorFileNotFound("pointer");
+
+	return makeStaticCnv(stream);
+}
+
+StaticCnv* AmigaDisk_ns::loadStatic(const char* name) {
+	debugC(1, kDebugDisk, "AmigaDisk_ns::loadStatic '%s'", name);
+
+	Common::SeekableReadStream *s = openArchivedFile(name, true);
+	StaticCnv *cnv = makeStaticCnv(*s);
+
+	delete s;
+
+	return cnv;
+}
+
+Common::SeekableReadStream *AmigaDisk_ns::openArchivedFile(const char* name, bool errorOnFileNotFound) {
+	debugC(3, kDebugDisk, "AmigaDisk_ns::openArchivedFile(%s)", name);
+
+	if (_resArchive.openArchivedFile(name)) {
+		return new DummyArchiveStream(_resArchive);
+	}
+
+	char path[PATH_LEN];
+
+	sprintf(path, "%s.pp", name);
+	if (_resArchive.openArchivedFile(path)) {
+		return new PowerPackerStream(_resArchive);
+	}
+
+	sprintf(path, "%s.dd", name);
+	if (_resArchive.openArchivedFile(path)) {
+		return new PowerPackerStream(_resArchive);
+	}
+
+	if (errorOnFileNotFound)
+		errorFileNotFound(name);
+
+	return NULL;
+}
+
+/*
+	FIXME: mask values are not computed correctly for level 1 and 2
+
+	NOTE: this routine is only able to build masks for Nippon Safes, since mask widths are hardcoded
+	into the main loop.
+*/
+void buildMask(byte* buf) {
+
+	byte mask1[16] = { 0, 0x80, 0x20, 0xA0, 8, 0x88, 0x28, 0xA8, 2, 0x82, 0x22, 0xA2, 0xA, 0x8A, 0x2A, 0xAA };
+	byte mask0[16] = { 0, 0x40, 0x10, 0x50, 4, 0x44, 0x14, 0x54, 1, 0x41, 0x11, 0x51, 0x5, 0x45, 0x15, 0x55 };
+
+	byte plane0[40];
+	byte plane1[40];
+
+	for (int32 i = 0; i < _vm->_screenHeight; i++) {
+
+		memcpy(plane0, buf, 40);
+		memcpy(plane1, buf+40, 40);
+
+		for (uint32 j = 0; j < 40; j++) {
+			*buf++ = mask0[(plane0[j] & 0xF0) >> 4] | mask1[(plane1[j] & 0xF0) >> 4];
+			*buf++ = mask0[plane0[j] & 0xF] | mask1[plane1[j] & 0xF];
+		}
+
+	}
+}
+
+class BackgroundDecoder : public Graphics::ILBMDecoder {
+
+	PaletteFxRange *_range;
+	uint32			_i;
+
+protected:
+	void readCRNG(Common::IFFChunk &chunk) {
+		_range[_i]._timer = chunk.readUint16BE();
+		_range[_i]._step = chunk.readUint16BE();
+		_range[_i]._flags = chunk.readUint16BE();
+		_range[_i]._first = chunk.readByte();
+		_range[_i]._last = chunk.readByte();
+
+		_i++;
+	}
+
+public:
+	BackgroundDecoder(Common::ReadStream &input, Graphics::Surface &surface, byte *&colors, PaletteFxRange *range) :
+		Graphics::ILBMDecoder(input, surface, colors), _range(range), _i(0) {
+	}
+
+	void decode() {
+		Common::IFFChunk *chunk;
+		while ((chunk = nextChunk()) != 0) {
+			switch (chunk->id) {
+			case ID_BMHD:
+				readBMHD(*chunk);
+				break;
+
+			case ID_CMAP:
+				readCMAP(*chunk);
+				break;
+
+			case ID_BODY:
+				readBODY(*chunk);
+				break;
+
+			case ID_CRNG:
+				readCRNG(*chunk);
+				break;
+			}
+		}
+	}
+
+	uint32	getNumRanges() {
+		return _i;
+	}
+};
+
+
+void AmigaDisk_ns::loadBackground(const char *name) {
+
+	Common::SeekableReadStream *s = openArchivedFile(name, true);
+
+	Graphics::Surface surf;
+	byte *pal;
+	BackgroundDecoder decoder(*s, surf, pal, _vm->_gfx->_palettefx);
+	decoder.decode();
+
+	for (uint32 i = 0; i < BASE_PALETTE_COLORS * 3; i++)
+		_vm->_gfx->_palette[i] = pal[i] >> 2;
+	free(pal);
+	_vm->_gfx->setPalette(_vm->_gfx->_palette);
+	_vm->_gfx->setBackground(static_cast<byte*>(surf.pixels));
+	surf.free();
+	delete s;
+
+	return;
+
+}
+
+void AmigaDisk_ns::loadMask(const char *name) {
+
+	char path[PATH_LEN];
+	sprintf(path, "%s.mask", name);
+
+	Common::SeekableReadStream *s = openArchivedFile(path, false);
+	if (s == NULL)
+		return;	// no errors if missing mask files: not every location has one
+
+	s->seek(0x30, SEEK_SET);
+
+	byte r, g, b;
+	for (uint i = 0; i < 4; i++) {
+		r = s->readByte();
+		g = s->readByte();
+		b = s->readByte();
+
+		_vm->_gfx->_bgLayers[i] = (((r << 4) & 0xF00) | (g & 0xF0) | (b >> 4)) & 0xFF;
+
+//		printf("rgb = (%x, %x, %x) -> %x\n", r, g, b, _vm->_gfx->_bgLayers[i]);
+	}
+
+
+	s->seek(0x126, SEEK_SET);	// HACK: skipping IFF/ILBM header should be done by analysis, not magic
+	Graphics::PackBitsReadStream stream(*s);
+
+	byte *buf = (byte*)malloc(_vm->_screenMaskSize);
+	stream.read(buf, _vm->_screenMaskSize);
+	buildMask(buf);
+	_vm->_gfx->setMask(buf);
+	free(buf);
+	delete s;
+
+	return;
+}
+
+void AmigaDisk_ns::loadPath(const char *name) {
+
+	char path[PATH_LEN];
+	sprintf(path, "%s.path", name);
+
+	Common::SeekableReadStream *s = openArchivedFile(path, false);
+	if (s == NULL)
+		return;	// no errors if missing path files: not every location has one
+
+
+	s->seek(0x120, SEEK_SET);	// HACK: skipping IFF/ILBM header should be done by analysis, not magic
+
+	Graphics::PackBitsReadStream stream(*s);
+	byte *buf = (byte*)malloc(_vm->_screenPathSize);
+	stream.read(buf, _vm->_screenPathSize);
+	_vm->setPath(buf);
+	free(buf);
+	delete s;
+
+	return;
+}
+
+void AmigaDisk_ns::loadScenery(const char* background, const char* mask) {
+	debugC(1, kDebugDisk, "AmigaDisk_ns::loadScenery '%s', '%s'", background, mask);
+
+	char path[PATH_LEN];
+	sprintf(path, "%s.bkgnd", background);
+
+	loadBackground(path);
+	loadMask(background);
+	loadPath(background);
+
+	return;
+}
+
+void AmigaDisk_ns::loadSlide(const char *name) {
+	debugC(1, kDebugDisk, "AmigaDisk_ns::loadSlide '%s'", name);
+
+	char path[PATH_LEN];
+	sprintf(path, "slides/%s", name);
+	Common::SeekableReadStream *s = openArchivedFile(path, false);
+	if (s)
+		loadBackground(path);
+	else
+		loadBackground(name);
+
+	return;
+}
+
+Cnv* AmigaDisk_ns::loadFrames(const char* name) {
+	debugC(1, kDebugDisk, "AmigaDisk_ns::loadFrames '%s'", name);
+
+	Common::SeekableReadStream *s;
+
+	char path[PATH_LEN];
+	sprintf(path, "anims/%s", name);
+
+	s = openArchivedFile(path, false);
+	if (!s)
+		s = openArchivedFile(name, true);
+
+	Cnv *cnv = makeCnv(*s);
+	delete s;
+
+	return cnv;
+}
+
+StaticCnv* AmigaDisk_ns::loadHead(const char* name) {
+	debugC(1, kDebugDisk, "AmigaDisk_ns::loadHead '%s'", name);
+
+	char path[PATH_LEN];
+	sprintf(path, "%s.head", name);
+
+	Common::SeekableReadStream *s = openArchivedFile(path, true);
+	StaticCnv *cnv = makeStaticCnv(*s);
+
+	delete s;
+
+	return cnv;
+}
+
+
+Cnv* AmigaDisk_ns::loadObjects(const char *name) {
+	debugC(1, kDebugDisk, "AmigaDisk_ns::loadObjects");
+
+	char path[PATH_LEN];
+	if (_vm->getFeatures() & GF_DEMO)
+		sprintf(path, "%s.objs", name);
+	else
+		sprintf(path, "objs/%s.objs", name);
+
+	Common::SeekableReadStream *s = openArchivedFile(path, true);
+
+	Cnv *cnv = makeCnv(*s);
+	delete s;
+
+	return cnv;
+}
+
+
+Cnv* AmigaDisk_ns::loadTalk(const char *name) {
+	debugC(1, kDebugDisk, "AmigaDisk_ns::loadTalk '%s'", name);
+
+	Common::SeekableReadStream *s;
+
+	char path[PATH_LEN];
+	if (_vm->getFeatures() & GF_DEMO)
+		sprintf(path, "%s.talk", name);
+	else
+		sprintf(path, "talk/%s.talk", name);
+
+	s = openArchivedFile(path, false);
+	if (s == NULL) {
+		s = openArchivedFile(name, true);
+	}
+
+	Cnv *cnv = makeCnv(*s);
+	delete s;
+
+	return cnv;
+}
+
+Table* AmigaDisk_ns::loadTable(const char* name) {
+	debugC(1, kDebugDisk, "AmigaDisk_ns::loadTable '%s'", name);
+
+	char path[PATH_LEN];
+	sprintf(path, "%s.table", name);
+
+	bool dispose = false;
+
+	Common::SeekableReadStream *stream;
+
+	if (!scumm_stricmp(name, "global")) {
+		Common::File *s = new Common::File;
+		if (!s->open(path))
+			errorFileNotFound(path);
+
+		dispose = true;
+		stream = s;
+	} else {
+		if (!(_vm->getFeatures() & GF_DEMO))
+			sprintf(path, "objs/%s.table", name);
+		if (!_resArchive.openArchivedFile(path))
+			errorFileNotFound(path);
+
+		stream = &_resArchive;
+	}
+
+	Table *t = new Table(100);
+
+	fillBuffers(*stream);
+	while (scumm_stricmp(_tokens[0], "ENDTABLE")) {
+		t->addData(_tokens[0]);
+		fillBuffers(*stream);
+	}
+
+	if (dispose)
+		delete stream;
+
+	return t;
+}
+
+Font* AmigaDisk_ns::loadFont(const char* name) {
+	debugC(1, kDebugDisk, "AmigaFullDisk::loadFont '%s'", name);
+
+	char path[PATH_LEN];
+	sprintf(path, "%sfont", name);
+
+	if (_vm->getFeatures() & GF_LANG_IT) {
+		// Italian version has separate font files
+		Common::File stream;
+		if (!stream.open(path))
+			errorFileNotFound(path);
+
+		return createFont(name, stream);
+	} else {
+		if (!_resArchive.openArchivedFile(path))
+			errorFileNotFound(path);
+
+		return createFont(name, _resArchive);
+	}
+}
+
+
+Common::ReadStream* AmigaDisk_ns::loadMusic(const char* name) {
+	return openArchivedFile(name);
+}
+
+Common::ReadStream* AmigaDisk_ns::loadSound(const char* name) {
+	char path[PATH_LEN];
+	sprintf(path, "%s.snd", name);
+
+	openArchivedFile(path);
+
+	return new DummyArchiveStream(_resArchive);
+}
+
+} // namespace Parallaction

Modified: scummvm/trunk/engines/parallaction/font.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/font.cpp	2007-07-27 18:36:50 UTC (rev 28245)
+++ scummvm/trunk/engines/parallaction/font.cpp	2007-07-27 19:02:19 UTC (rev 28246)
@@ -408,7 +408,7 @@
 
 }
 
-Font *DosDisk::createFont(const char *name, Cnv* cnv) {
+Font *DosDisk_ns::createFont(const char *name, Cnv* cnv) {
 	Font *f = 0;
 
 	if (!scumm_stricmp(name, "comic"))
@@ -425,7 +425,7 @@
 	return f;
 }
 
-Font *AmigaDisk::createFont(const char *name, Common::SeekableReadStream &stream) {
+Font *AmigaDisk_ns::createFont(const char *name, Common::SeekableReadStream &stream) {
 	// TODO: implement AmigaLabelFont for labels
 	return new AmigaFont(stream);
 }

Modified: scummvm/trunk/engines/parallaction/module.mk
===================================================================
--- scummvm/trunk/engines/parallaction/module.mk	2007-07-27 18:36:50 UTC (rev 28245)
+++ scummvm/trunk/engines/parallaction/module.mk	2007-07-27 19:02:19 UTC (rev 28246)
@@ -7,7 +7,8 @@
 	debug.o \
 	detection.o \
 	dialogue.o \
-	disk.o \
+	disk_br.o \
+	disk_ns.o \
 	font.o \
 	graphics.o \
 	intro.o \

Modified: scummvm/trunk/engines/parallaction/parallaction.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/parallaction.cpp	2007-07-27 18:36:50 UTC (rev 28245)
+++ scummvm/trunk/engines/parallaction/parallaction.cpp	2007-07-27 19:02:19 UTC (rev 28246)
@@ -191,17 +191,24 @@
 	_screenMaskSize = _screenMaskWidth * _screenHeight;
 	_screenPathSize = _screenPathWidth * _screenHeight;
 
-
-
-	if (getPlatform() == Common::kPlatformPC) {
-		_disk = new DosDisk(this);
-	} else {
-		if (getFeatures() & GF_DEMO) {
-			strcpy(_location._name, "fognedemo");
+	if (getGameType() == GType_Nippon) {
+		if (getPlatform() == Common::kPlatformPC) {
+			_disk = new DosDisk_ns(this);
+		} else {
+			if (getFeatures() & GF_DEMO) {
+				strcpy(_location._name, "fognedemo");
+			}
+			_disk = new AmigaDisk_ns(this);
+			_disk->selectArchive((_vm->getFeatures() & GF_DEMO) ? "disk0" : "disk1");
 		}
-		_disk = new AmigaDisk(this);
-		_disk->selectArchive((_vm->getFeatures() & GF_DEMO) ? "disk0" : "disk1");
-	}
+	} else
+	if (getGameType() == GType_BRA) {
+		if (getPlatform() == Common::kPlatformPC) {
+			_disk = new DosDisk_br(this);
+		} else
+			error("unsupported platform for Big Red Adventure");
+	} else
+		error("unknown game type");
 
 	_engineFlags = 0;
 

Modified: scummvm/trunk/engines/parallaction/walk.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/walk.cpp	2007-07-27 18:36:50 UTC (rev 28245)
+++ scummvm/trunk/engines/parallaction/walk.cpp	2007-07-27 19:02:19 UTC (rev 28246)
@@ -41,7 +41,7 @@
 uint16 queryPath(uint16 x, uint16 y) {
 
 	// NOTE: a better solution would have us mirror each byte in the mask in the loading routine
-	// AmigaDisk::loadPath() instead of doing it here.
+	// AmigaDisk_ns::loadPath() instead of doing it here.
 
 	byte _al = _buffer[y*40 + x/8];
 	byte _dl = (_vm->getPlatform() == Common::kPlatformPC) ? (x & 7) : (7 - (x & 7));


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