From 5135439bbd64289e4c6c780f4b4da03ce40e75be Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 1 Jan 2015 14:57:56 -1000 Subject: XEEN: Reorganisation of resource, sprite, and cc file class files --- engines/xeen/dialogs.cpp | 2 +- engines/xeen/dialogs_options.cpp | 5 +- engines/xeen/events.h | 2 +- engines/xeen/files.cpp | 214 +++++++++++++++ engines/xeen/files.h | 58 ++++ engines/xeen/font.cpp | 2 +- engines/xeen/module.mk | 2 + engines/xeen/resdata.cpp | 235 ---------------- engines/xeen/resdata.h | 41 --- engines/xeen/resources.cpp | 562 ++++++++++++++------------------------- engines/xeen/resources.h | 82 +----- engines/xeen/sound.h | 2 +- engines/xeen/sprites.cpp | 201 ++++++++++++++ engines/xeen/sprites.h | 87 ++++++ engines/xeen/xeen.cpp | 4 +- engines/xeen/xsurface.cpp | 2 +- 16 files changed, 787 insertions(+), 714 deletions(-) create mode 100644 engines/xeen/files.cpp create mode 100644 engines/xeen/files.h delete mode 100644 engines/xeen/resdata.cpp delete mode 100644 engines/xeen/resdata.h create mode 100644 engines/xeen/sprites.cpp create mode 100644 engines/xeen/sprites.h diff --git a/engines/xeen/dialogs.cpp b/engines/xeen/dialogs.cpp index cdc6d5ba40..4d1a87647d 100644 --- a/engines/xeen/dialogs.cpp +++ b/engines/xeen/dialogs.cpp @@ -22,7 +22,7 @@ #include "common/scummsys.h" #include "xeen/dialogs.h" -#include "xeen/resdata.h" +#include "xeen/resources.h" namespace Xeen { diff --git a/engines/xeen/dialogs_options.cpp b/engines/xeen/dialogs_options.cpp index a92fd59715..e85a4af51d 100644 --- a/engines/xeen/dialogs_options.cpp +++ b/engines/xeen/dialogs_options.cpp @@ -22,7 +22,7 @@ #include "common/scummsys.h" #include "xeen/dialogs_options.h" -#include "xeen/resdata.h" +#include "xeen/resources.h" namespace Xeen { @@ -94,6 +94,9 @@ void OptionsMenu::execute() { // Show credits CreditsScreen::show(_vm); break; + } else if (key == 27) { + // Hide the options menu + break; } } } diff --git a/engines/xeen/events.h b/engines/xeen/events.h index 6183b75105..5a9faf14d8 100644 --- a/engines/xeen/events.h +++ b/engines/xeen/events.h @@ -25,7 +25,7 @@ #include "common/scummsys.h" #include "common/events.h" -#include "xeen/resources.h" +#include "xeen/sprites.h" namespace Xeen { diff --git a/engines/xeen/files.cpp b/engines/xeen/files.cpp new file mode 100644 index 0000000000..27bbf6e399 --- /dev/null +++ b/engines/xeen/files.cpp @@ -0,0 +1,214 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/scummsys.h" +#include "common/archive.h" +#include "common/memstream.h" +#include "common/textconsole.h" +#include "xeen/xeen.h" +#include "xeen/files.h" + +namespace Xeen { + +/** + * Xeen CC file implementation + */ +class CCArchive : public Common::Archive { +private: + /** + * Details of a single entry in a CC file index + */ + struct CCEntry { + uint16 _id; + uint32 _offset; + uint16 _size; + + CCEntry() : _id(0), _offset(0), _size(0) {} + CCEntry(uint16 id, uint32 offset, uint32 size) + : _id(id), _offset(offset), _size(size) { + } + }; + + Common::Array _index; + Common::String _filename; + + uint16 convertNameToId(const Common::String &resourceName) const; + + void loadIndex(Common::SeekableReadStream *stream); + + bool getHeaderEntry(const Common::String &resourceName, CCEntry &ccEntry) const; +public: + CCArchive(const Common::String &filename); + virtual ~CCArchive(); + + // Archive implementation + virtual bool hasFile(const Common::String &name) const; + virtual int listMembers(Common::ArchiveMemberList &list) const; + virtual const Common::ArchiveMemberPtr getMember(const Common::String &name) const; + virtual Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const; +}; + +CCArchive::CCArchive(const Common::String &filename): _filename(filename) { + File f(filename); + loadIndex(&f); +} + +CCArchive::~CCArchive() { +} + +// Archive implementation +bool CCArchive::hasFile(const Common::String &name) const { + CCEntry ccEntry; + return getHeaderEntry(name, ccEntry); +} + +int CCArchive::listMembers(Common::ArchiveMemberList &list) const { + // CC files don't maintain the original filenames, so we can't list it + return 0; +} + +const Common::ArchiveMemberPtr CCArchive::getMember(const Common::String &name) const { + if (!hasFile(name)) + return Common::ArchiveMemberPtr(); + + return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this)); +} + +Common::SeekableReadStream *CCArchive::createReadStreamForMember(const Common::String &name) const { + CCEntry ccEntry; + + if (getHeaderEntry(name, ccEntry)) { + // Open the correct CC file + Common::File f; + if (!f.open(_filename)) + error("Could not open CC file"); + + // Read in the data for the specific resource + f.seek(ccEntry._offset); + byte *data = new byte[ccEntry._size]; + f.read(data, ccEntry._size); + + // Decrypt the data + for (int i = 0; i < ccEntry._size; ++i) + data[i] ^= 0x35; + + // Return the data as a stream + return new Common::MemoryReadStream(data, ccEntry._size, DisposeAfterUse::YES); + } + + return nullptr; +} + +/** + * Hash a given filename to produce the Id that represents it + */ +uint16 CCArchive::convertNameToId(const Common::String &resourceName) const { + if (resourceName.empty()) + return 0xffff; + + Common::String name = resourceName; + name.toUppercase(); + + const byte *msgP = (const byte *)name.c_str(); + int total = *msgP++; + for (; *msgP; total += *msgP++) { + // Rotate the bits in 'total' right 7 places + total = (total & 0x007F) << 9 | (total & 0xFF80) >> 7; + } + + return total; +} + +/** + * Load the index of a given CC file + */ +void CCArchive::loadIndex(Common::SeekableReadStream *stream) { + int count = stream->readUint16LE(); + + // Read in the data for the archive's index + byte *rawIndex = new byte[count * 8]; + stream->read(rawIndex, count * 8); + + // Decrypt the index + int ah = 0xac; + for (int i = 0; i < count * 8; ++i) { + rawIndex[i] = (byte)(((rawIndex[i] << 2 | rawIndex[i] >> 6) + ah) & 0xff); + ah += 0x67; + } + + // Extract the index data into entry structures + _index.reserve(count); + const byte *entryP = &rawIndex[0]; + for (int i = 0; i < count; ++i, entryP += 8) { + CCEntry entry; + entry._id = READ_LE_UINT16(entryP); + entry._offset = READ_LE_UINT32(entryP + 2) & 0xffffff; + entry._size = READ_LE_UINT16(entryP + 5); + assert(!entryP[7]); + + _index.push_back(entry); + } + + delete[] rawIndex; +} + +/** +* Given a resource name, returns whether an entry exists, and returns +* the header index data for that entry +*/ +bool CCArchive::getHeaderEntry(const Common::String &resourceName, CCEntry &ccEntry) const { + uint16 id = convertNameToId(resourceName); + + // Loop through the index + for (uint i = 0; i < _index.size(); ++i) { + if (_index[i]._id == id) { + ccEntry = _index[i]; + return true; + } + } + + // Could not find an entry + return false; +} + +/*------------------------------------------------------------------------*/ + +void FileManager::init(XeenEngine *vm) { + Common::File f; + + if (vm->getGameID() != GType_Clouds) + SearchMan.add("dark", new CCArchive("dark.cc")); + SearchMan.add("xeen", new CCArchive("xeen.cc")); + SearchMan.add("intro", new CCArchive("intro.cc")); +} + +/*------------------------------------------------------------------------*/ + +/** + * Opens the given file, throwing an error if it can't be opened + */ +void File::openFile(const Common::String &filename) { + if (!Common::File::open(filename)) + error("Could not open file - %s", filename.c_str()); +} + +} // End of namespace Xeen diff --git a/engines/xeen/files.h b/engines/xeen/files.h new file mode 100644 index 0000000000..7ef126e01d --- /dev/null +++ b/engines/xeen/files.h @@ -0,0 +1,58 @@ +/* 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. + * + */ + +#ifndef XEEN_FILES_H +#define XEEN_FILES_H + +#include "common/scummsys.h" +#include "common/array.h" +#include "common/file.h" +#include "graphics/surface.h" +#include "xeen/xsurface.h" + +namespace Xeen { + +class XeenEngine; + +class FileManager { +public: + /** + * Instantiates the resource manager + */ + static void init(XeenEngine *vm); +}; + +/** + * Derived file class + */ +class File : public Common::File { +public: + File() : Common::File() {} + File(const Common::String &filename) { openFile(filename); } + virtual ~File() {} + + void openFile(const Common::String &filename); +}; + +} // End of namespace Xeen + +#endif /* XEEN_FILES_H */ diff --git a/engines/xeen/font.cpp b/engines/xeen/font.cpp index 8b80ec24ca..b5608d48b8 100644 --- a/engines/xeen/font.cpp +++ b/engines/xeen/font.cpp @@ -22,7 +22,7 @@ #include "common/endian.h" #include "xeen/font.h" -#include "xeen/resdata.h" +#include "xeen/resources.h" namespace Xeen { diff --git a/engines/xeen/module.mk b/engines/xeen/module.mk index 99eb98174e..cdd8e549d4 100644 --- a/engines/xeen/module.mk +++ b/engines/xeen/module.mk @@ -9,11 +9,13 @@ MODULE_OBJS := \ dialogs.o \ dialogs_options.o \ events.o \ + files.o \ font.o \ resdata.o \ resources.o \ screen.o \ sound.o \ + sprites.o \ xeen.o \ xsurface.o diff --git a/engines/xeen/resdata.cpp b/engines/xeen/resdata.cpp deleted file mode 100644 index b9309b4adb..0000000000 --- a/engines/xeen/resdata.cpp +++ /dev/null @@ -1,235 +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. - * - */ - -#include "common/scummsys.h" -#include "xeen/resdata.h" - -namespace Xeen { - -const char *const CREDITS = - "\013012\010000\003c\01435Designed and Directed By:\n" - "\01417Jon Van Caneghem\003l\n" - "\n" - "\t025\01435Programming:\n" - "\t035\01417Mark Caldwell\n" - "\t035Dave Hathaway\n" - "\n" - "\t025\01435Sound System & FX:\n" - "\t035\01417Mike Heilemann\n" - "\n" - "\t025\01435Music & Speech:\n" - "\t035\01417Tim Tully\n" - "\n" - "\t025\01435Writing:\n" - "\t035\01417Paul Rattner\n" - "\t035Debbie Van Caneghem\n" - "\t035Jon Van Caneghem\013012\n" - "\n" - "\n" - "\t180\01435Graphics:\n" - "\t190\01417Jonathan P. Gwyn\n" - "\t190Bonita Long-Hemsath\n" - "\t190Julia Ulano\n" - "\t190Ricardo Barrera\n" - "\n" - "\t180\01435Testing:\n" - "\t190\01417Benjamin Bent\n" - "\t190Christian Dailey\n" - "\t190Mario Escamilla\n" - "\t190Marco Hunter\n" - "\t190Robert J. Lupo\n" - "\t190Clayton Retzer\n" - "\t190David Vela\003c"; - -const char *const OPTIONS_TITLE = - "\x0D\x01\003c\014dMight and Magic Options\n" - "World of Xeen\x02\n" - "\v117Copyright (c) 1993 NWC, Inc.\n" - "All Rights Reserved\x01"; - -const byte SYMBOLS[20][64] = { - { // 0 - 0x00, 0x00, 0xA8, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x00, 0xA8, 0x9E, 0x9C, 0x9C, 0x9E, 0x9E, 0x9E, - 0xAC, 0x9C, 0xA4, 0xAC, 0xAC, 0x9A, 0x9A, 0x9A, 0xAC, 0x9E, 0xAC, 0xA8, 0xA8, 0xA6, 0x97, 0x98, - 0xAC, 0xA0, 0xAC, 0xAC, 0xA4, 0xA6, 0x98, 0x99, 0x00, 0xAC, 0xA0, 0xA0, 0xA8, 0xAC, 0x9A, 0x9A, - 0x00, 0x00, 0xAC, 0xAC, 0xAC, 0xA4, 0x9B, 0x9A, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xA0, 0x9B, 0x9B, - }, - { // 1 - 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, - 0x99, 0x9A, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0x99, 0x98, 0x98, 0x98, 0x97, 0x97, 0x97, 0x97, 0x97, - 0x99, 0x98, 0x98, 0x99, 0x98, 0x98, 0x99, 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9B, 0x9B, 0x9C, 0x9B, 0x9A, 0x9C, 0x9A, 0x9B, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0x9A, 0x9B, - }, - { // 2 - 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, - 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x99, 0x98, 0x98, 0x99, 0x98, 0x98, 0x97, 0x98, 0x98, - 0x99, 0x98, 0x98, 0x98, 0x99, 0x99, 0x98, 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9B, 0x9B, 0x9C, 0x9C, 0x9B, 0x9B, 0x9B, 0x9B, 0x99, 0x9A, 0x9B, 0x9B, 0x9A, 0x9A, 0x99, 0x9A, - }, - { // 3 - 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, - 0x99, 0x9A, 0x9A, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0x98, 0x98, 0x97, 0x97, 0x98, 0x98, 0x98, 0x98, - 0x99, 0x99, 0x98, 0x99, 0x98, 0x98, 0x99, 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9B, 0x9C, 0x9B, 0x9B, 0x9C, 0x9C, 0x9C, 0x9C, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x99, 0x99, 0x9A, - }, - { // 4 - 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, - 0x9A, 0x9A, 0x9A, 0x99, 0x99, 0x99, 0x99, 0x9A, 0x97, 0x97, 0x97, 0x97, 0x97, 0x98, 0x98, 0x98, - 0x99, 0x99, 0x98, 0x99, 0x99, 0x98, 0x98, 0x98, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9C, 0x9B, 0x9B, 0x9C, 0x9B, 0x9B, 0x9B, 0x9A, 0x99, 0x9B, 0x9B, 0x9A, 0x99, 0x9A, 0x9A, - }, - { // 5 - 0xA4, 0xA4, 0xA8, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x9E, 0x9E, 0xA0, 0xA8, 0xAC, 0x00, 0x00, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9E, 0xAC, 0x00, 0x97, 0x97, 0x97, 0x98, 0x9C, 0x9C, 0xA0, 0xAC, - 0x99, 0x98, 0x99, 0x99, 0x99, 0x9B, 0xA0, 0xAC, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9B, 0xA0, 0xAC, - 0x9C, 0x9B, 0x9C, 0x9C, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x9A, 0x9A, 0x9B, 0x9B, 0xA4, 0xAC, 0x00, - }, - { // 6 - 0x00, 0x00, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x00, 0x00, 0x00, 0xAC, 0xA0, 0x9C, 0x9B, 0x99, - 0x00, 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x98, 0x99, 0x99, - 0x00, 0xAC, 0xA0, 0x9C, 0x9C, 0xA0, 0x9C, 0x9A, 0x00, 0x00, 0xAC, 0xA4, 0xA0, 0x99, 0x99, 0x99, - 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, - }, - { // 7 - 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x00, 0x00, 0xAC, 0xA4, 0x9C, 0x9C, 0x99, 0x99, - 0x00, 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x00, 0x00, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x99, - 0x00, 0x00, 0xAC, 0xA0, 0x9B, 0xA0, 0x9E, 0x9C, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x9C, 0x99, 0x99, - }, - { // 8 - 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x9B, 0x99, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, - 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x9C, 0x99, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x9E, 0x9C, 0x99, - }, - { // 9 - 0x00, 0x00, 0xAC, 0xA4, 0xA0, 0x9C, 0x99, 0x99, 0x00, 0xAC, 0xA0, 0x9C, 0x9C, 0xA0, 0x9C, 0x9A, - 0xAC, 0xA4, 0x9C, 0x9A, 0x99, 0x99, 0x99, 0x99, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, - 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, - 0x00, 0xAC, 0xA4, 0x9C, 0x9A, 0x9C, 0x99, 0x99, 0x00, 0x00, 0xAC, 0xA0, 0x9C, 0x9A, 0x99, 0x99, - }, - { // 10 - 0x99, 0x99, 0x99, 0x9A, 0xA0, 0xAC, 0x00, 0x00, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x00, - 0x99, 0x99, 0x9C, 0x9E, 0xA4, 0xAC, 0x00, 0x00, 0x99, 0x99, 0x9C, 0x99, 0x9C, 0xA4, 0xAC, 0x00, - 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x00, - 0x99, 0x99, 0x99, 0xA0, 0xA4, 0xAC, 0x00, 0x00, 0x9A, 0x9B, 0x9E, 0x9C, 0x9C, 0xA4, 0xAC, 0x00, - }, - { // 11 - 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0x9E, 0xAC, - 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA4, 0xAC, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, - 0x9C, 0x99, 0x99, 0x99, 0x9C, 0x9C, 0xA4, 0xAC, 0x99, 0x9E, 0x9E, 0x9C, 0x9C, 0xA0, 0xAC, 0x00, - }, - { // 12 - 0x99, 0x99, 0x9C, 0xA0, 0xA4, 0xAC, 0x00, 0x00, 0x9B, 0x9C, 0x9E, 0x9C, 0x9C, 0xA4, 0xAC, 0x00, - 0x99, 0x99, 0x99, 0x99, 0x99, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, - 0x99, 0x99, 0x99, 0x99, 0x9C, 0x9C, 0xA4, 0xAC, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xA4, 0xAC, 0x00, - 0x99, 0x99, 0x9C, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, - }, - { // 13 - 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x00, - 0x99, 0x9B, 0x9C, 0xA0, 0xA4, 0xAC, 0x00, 0x00, 0x99, 0x99, 0x9A, 0x99, 0x9C, 0xA0, 0xAC, 0x00, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA4, 0xAC, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0x9C, 0xA4, 0xAC, 0x99, 0x99, 0x99, 0x9A, 0x9C, 0xA4, 0xAC, 0x00, - }, - { // 14 - 0x00, 0x00, 0xAC, 0x9E, 0x9C, 0x9C, 0x9C, 0x9B, 0x00, 0xAC, 0x9C, 0xA0, 0x9E, 0xA4, 0xA4, 0xA4, - 0xAC, 0x9C, 0xA4, 0xAC, 0xAC, 0xAC, 0x9C, 0x9E, 0xAC, 0xA0, 0xAC, 0xA8, 0x9E, 0xA8, 0xAC, 0x99, - 0xAC, 0x9E, 0xAC, 0xA8, 0xAC, 0x9E, 0xA4, 0xAC, 0xAC, 0xA4, 0xA0, 0xAC, 0xAC, 0xA0, 0xA4, 0xAC, - 0x00, 0xAC, 0xA4, 0xA0, 0xA0, 0xA4, 0xAC, 0xA4, 0x00, 0x00, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, - }, - { // 15 - 0x9C, 0x9C, 0x9C, 0x9B, 0x9C, 0x9C, 0x9C, 0x9B, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, - 0x9E, 0x9E, 0x9E, 0x9C, 0x9E, 0x9E, 0x9E, 0x9E, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x99, 0x98, - 0x9C, 0x9C, 0x9B, 0x9B, 0x9B, 0x9C, 0x9C, 0x9C, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0x9E, 0x9E, 0xA0, - 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, - }, - { // 16 - 0x9B, 0x9B, 0x9B, 0x9B, 0x9C, 0x9B, 0x9C, 0x9C, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, - 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9E, 0x98, 0x98, 0x98, 0x98, 0x99, 0x99, 0x99, 0x99, - 0x9C, 0x9B, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0xA0, 0xA0, 0xA0, 0x9E, 0xA0, 0x9E, 0x9E, 0xA0, - 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, - }, - { // 17 - 0x9C, 0x9C, 0x9C, 0x9B, 0x9B, 0x9B, 0x9C, 0x9B, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, - 0x9E, 0x9E, 0x9E, 0x9C, 0x9C, 0x9C, 0x9E, 0x9E, 0x98, 0x98, 0x98, 0x99, 0x9A, 0x9A, 0x99, 0x98, - 0x9C, 0x9B, 0x9C, 0x9C, 0x9C, 0x9B, 0x9B, 0x9C, 0xA0, 0x9E, 0x9E, 0xA0, 0xA0, 0xA0, 0xA0, 0x9E, - 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, - }, - { // 18 - 0x9B, 0x9B, 0x9C, 0x9C, 0x9C, 0x9B, 0x9B, 0x9B, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, - 0x9E, 0x9E, 0x9E, 0x9E, 0x9C, 0x9C, 0x9C, 0x9E, 0x98, 0x98, 0x98, 0x98, 0x9A, 0x9A, 0x98, 0x99, - 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9B, 0x9C, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0xA0, 0xA0, 0xA0, - 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, - }, - { // 19 - 0x9C, 0x9B, 0x9C, 0x9C, 0xA0, 0xA4, 0xAC, 0x00, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0x00, 0x00, - 0x9E, 0x9E, 0x9C, 0x9C, 0x9E, 0xA0, 0xAC, 0x00, 0x99, 0x98, 0x98, 0x99, 0x9A, 0x9A, 0xA0, 0xAC, - 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0xA0, 0xAC, 0xA0, 0xA0, 0x9E, 0xA0, 0xA0, 0xA0, 0xA0, 0xAC, - 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0x00, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0x00, 0x00, - } -}; - -const byte TEXT_COLORS[40][4] = { - { 0x00, 0x19, 0x19, 0x19 }, - { 0x00, 0x08, 0x08, 0x08 }, - { 0x00, 0x0F, 0x0F, 0x0F }, - { 0x00, 0x15, 0x15, 0x15 }, - { 0x00, 0x01, 0x01, 0x01 }, - { 0x00, 0x21, 0x21, 0x21 }, - { 0x00, 0x26, 0x26, 0x26 }, - { 0x00, 0x2B, 0x2B, 0x2B }, - { 0x00, 0x31, 0x31, 0x31 }, - { 0x00, 0x36, 0x36, 0x36 }, - { 0x00, 0x3D, 0x3D, 0x3D }, - { 0x00, 0x41, 0x41, 0x41 }, - { 0x00, 0x46, 0x46, 0x46 }, - { 0x00, 0x4C, 0x4C, 0x4C }, - { 0x00, 0x50, 0x50, 0x50 }, - { 0x00, 0x55, 0x55, 0x55 }, - { 0x00, 0x5D, 0x5D, 0x5D }, - { 0x00, 0x60, 0x60, 0x60 }, - { 0x00, 0x65, 0x65, 0x65 }, - { 0x00, 0x6C, 0x6C, 0x6C }, - { 0x00, 0x70, 0x70, 0x70 }, - { 0x00, 0x75, 0x75, 0x75 }, - { 0x00, 0x7B, 0x7B, 0x7B }, - { 0x00, 0x80, 0x80, 0x80 }, - { 0x00, 0x85, 0x85, 0x85 }, - { 0x00, 0x8D, 0x8D, 0x8D }, - { 0x00, 0x90, 0x90, 0x90 }, - { 0x00, 0x97, 0x97, 0x97 }, - { 0x00, 0x9D, 0x9D, 0x9D }, - { 0x00, 0xA4, 0xA4, 0xA4 }, - { 0x00, 0xAB, 0xAB, 0xAB }, - { 0x00, 0xB0, 0xB0, 0xB0 }, - { 0x00, 0xB6, 0xB6, 0xB6 }, - { 0x00, 0xBD, 0xBD, 0xBD }, - { 0x00, 0xC0, 0xC0, 0xC0 }, - { 0x00, 0xC6, 0xC6, 0xC6 }, - { 0x00, 0xCD, 0xCD, 0xCD }, - { 0x00, 0xD0, 0xD0, 0xD0 }, - { 0x00, 0xD6, 0xD6, 0xD6 }, - { 0x00, 0xDB, 0xDB, 0xDB }, -}; - -} // End of namespace Xeen diff --git a/engines/xeen/resdata.h b/engines/xeen/resdata.h deleted file mode 100644 index 3c549fc225..0000000000 --- a/engines/xeen/resdata.h +++ /dev/null @@ -1,41 +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. - * - */ - -#ifndef XEEN_RESDATA_H -#define XEEN_RESDATA_H - -#include "common/scummsys.h" -#include "gui/debugger.h" - -namespace Xeen { - -extern const char *const CREDITS; - -extern const char *const OPTIONS_TITLE; - -extern const byte SYMBOLS[20][64]; - -extern const byte TEXT_COLORS[40][4]; - -} // End of namespace Xeen - -#endif /* XEEN_RESDATA_H */ diff --git a/engines/xeen/resources.cpp b/engines/xeen/resources.cpp index ba2889fc9d..d1177dab00 100644 --- a/engines/xeen/resources.cpp +++ b/engines/xeen/resources.cpp @@ -8,12 +8,12 @@ * 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. @@ -21,365 +21,215 @@ */ #include "common/scummsys.h" -#include "common/archive.h" -#include "common/memstream.h" -#include "common/textconsole.h" -#include "xeen/xeen.h" #include "xeen/resources.h" namespace Xeen { -/** - * Xeen CC file implementation - */ -class CCArchive : public Common::Archive { -private: - /** - * Details of a single entry in a CC file index - */ - struct CCEntry { - uint16 _id; - uint32 _offset; - uint16 _size; - - CCEntry() : _id(0), _offset(0), _size(0) {} - CCEntry(uint16 id, uint32 offset, uint32 size) - : _id(id), _offset(offset), _size(size) { - } - }; - - Common::Array _index; - Common::String _filename; - - uint16 convertNameToId(const Common::String &resourceName) const; - - void loadIndex(Common::SeekableReadStream *stream); - - bool getHeaderEntry(const Common::String &resourceName, CCEntry &ccEntry) const; -public: - CCArchive(const Common::String &filename); - virtual ~CCArchive(); - - // Archive implementation - virtual bool hasFile(const Common::String &name) const; - virtual int listMembers(Common::ArchiveMemberList &list) const; - virtual const Common::ArchiveMemberPtr getMember(const Common::String &name) const; - virtual Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const; -}; - -CCArchive::CCArchive(const Common::String &filename): _filename(filename) { - File f(filename); - loadIndex(&f); -} - -CCArchive::~CCArchive() { -} - -// Archive implementation -bool CCArchive::hasFile(const Common::String &name) const { - CCEntry ccEntry; - return getHeaderEntry(name, ccEntry); -} - -int CCArchive::listMembers(Common::ArchiveMemberList &list) const { - // CC files don't maintain the original filenames, so we can't list it - return 0; -} - -const Common::ArchiveMemberPtr CCArchive::getMember(const Common::String &name) const { - if (!hasFile(name)) - return Common::ArchiveMemberPtr(); - - return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this)); -} - -Common::SeekableReadStream *CCArchive::createReadStreamForMember(const Common::String &name) const { - CCEntry ccEntry; - - if (getHeaderEntry(name, ccEntry)) { - // Open the correct CC file - Common::File f; - if (!f.open(_filename)) - error("Could not open CC file"); - - // Read in the data for the specific resource - f.seek(ccEntry._offset); - byte *data = new byte[ccEntry._size]; - f.read(data, ccEntry._size); - - // Decrypt the data - for (int i = 0; i < ccEntry._size; ++i) - data[i] ^= 0x35; - - // Return the data as a stream - return new Common::MemoryReadStream(data, ccEntry._size, DisposeAfterUse::YES); - } - - return nullptr; -} - -/** - * Hash a given filename to produce the Id that represents it - */ -uint16 CCArchive::convertNameToId(const Common::String &resourceName) const { - if (resourceName.empty()) - return 0xffff; - - Common::String name = resourceName; - name.toUppercase(); - - const byte *msgP = (const byte *)name.c_str(); - int total = *msgP++; - for (; *msgP; total += *msgP++) { - // Rotate the bits in 'total' right 7 places - total = (total & 0x007F) << 9 | (total & 0xFF80) >> 7; - } - - return total; -} - -/** - * Load the index of a given CC file - */ -void CCArchive::loadIndex(Common::SeekableReadStream *stream) { - int count = stream->readUint16LE(); - - // Read in the data for the archive's index - byte *rawIndex = new byte[count * 8]; - stream->read(rawIndex, count * 8); - - // Decrypt the index - int ah = 0xac; - for (int i = 0; i < count * 8; ++i) { - rawIndex[i] = (byte)(((rawIndex[i] << 2 | rawIndex[i] >> 6) + ah) & 0xff); - ah += 0x67; - } - - // Extract the index data into entry structures - _index.reserve(count); - const byte *entryP = &rawIndex[0]; - for (int i = 0; i < count; ++i, entryP += 8) { - CCEntry entry; - entry._id = READ_LE_UINT16(entryP); - entry._offset = READ_LE_UINT32(entryP + 2) & 0xffffff; - entry._size = READ_LE_UINT16(entryP + 5); - assert(!entryP[7]); - - _index.push_back(entry); - } - - delete[] rawIndex; -} - -/** -* Given a resource name, returns whether an entry exists, and returns -* the header index data for that entry -*/ -bool CCArchive::getHeaderEntry(const Common::String &resourceName, CCEntry &ccEntry) const { - uint16 id = convertNameToId(resourceName); - - // Loop through the index - for (uint i = 0; i < _index.size(); ++i) { - if (_index[i]._id == id) { - ccEntry = _index[i]; - return true; - } - } - - // Could not find an entry - return false; -} - -/*------------------------------------------------------------------------*/ - -void Resources::init(XeenEngine *vm) { - Common::File f; - - if (vm->getGameID() != GType_Clouds) - SearchMan.add("dark", new CCArchive("dark.cc")); - SearchMan.add("xeen", new CCArchive("xeen.cc")); - SearchMan.add("intro", new CCArchive("intro.cc")); -} - -/*------------------------------------------------------------------------*/ - -/** - * Opens the given file, throwing an error if it can't be opened - */ -void File::openFile(const Common::String &filename) { - if (!Common::File::open(filename)) - error("Could not open file - %s", filename.c_str()); -} - -/*------------------------------------------------------------------------*/ - -GraphicResource::GraphicResource(const Common::String &filename) { - // Open the resource - File f(filename); - - // Read in a copy of the file - _filesize = f.size(); - _data = new byte[_filesize]; - f.seek(0); - f.read(_data, _filesize); -} - -GraphicResource::~GraphicResource() { - delete[] _data; -} - -int GraphicResource::size() const { - return READ_LE_UINT16(_data); -} - -void GraphicResource::drawOffset(XSurface &dest, uint16 offset, const Common::Point &destPos) const { - // Get cell header - Common::MemoryReadStream f(_data, _filesize); - f.seek(offset); - int xOffset = f.readUint16LE(); - int width = f.readUint16LE(); - int yOffset = f.readUint16LE(); - int height = f.readUint16LE(); - - if (dest.w < (xOffset + width) || dest.h < (yOffset + height)) - dest.create(xOffset + width, yOffset + height); - - // The pattern steps used in the pattern command - const int patternSteps[] = { 0, 1, 1, 1, 2, 2, 3, 3, 0, -1, -1, -1, -2, -2, -3, -3 }; - - // Main loop - int opr1, opr2; - int32 pos; - for (int yPos = yOffset, byteCount = 0; yPos < height + yOffset; yPos++, byteCount = 0) { - // The number of bytes in this scan line - int lineLength = f.readByte(); - - if (lineLength == 0) { - // Skip the specified number of scan lines - yPos += f.readByte(); - } else { - // Skip the transparent pixels at the beginning of the scan line - int xPos = f.readByte() + xOffset; ++byteCount; - byte *destP = (byte *)dest.getBasePtr(destPos.x + xPos, destPos.y + yPos); - - while (byteCount < lineLength) { - // The next byte is an opcode that determines what - // operators are to follow and how to interpret them. - int opcode = f.readByte(); ++byteCount; - - // Decode the opcode - int len = opcode & 0x1F; - int cmd = (opcode & 0xE0) >> 5; - - switch (cmd) { - case 0: // The following len + 1 bytes are stored as indexes into the color table. - case 1: // The following len + 33 bytes are stored as indexes into the color table. - for (int i = 0; i < opcode + 1; ++i, ++xPos) { - *destP++ = f.readByte(); ++byteCount; - } - break; - - case 2: // The following byte is an index into the color table, draw it len + 3 times. - opr1 = f.readByte(); ++byteCount; - for (int i = 0; i < len + 3; ++i, ++xPos) - *destP++ = opr1; - break; - - case 3: // Stream copy command. - opr1 = f.readUint16LE(); byteCount += 2; - pos = f.pos(); - f.seek(-opr1, SEEK_CUR); - - for (int i = 0; i < len + 4; ++i, ++xPos) - *destP++ = f.readByte(); - - f.seek(pos, SEEK_SET); - break; - - case 4: // The following two bytes are indexes into the color table, draw the pair len + 2 times. - opr1 = f.readByte(); ++byteCount; - opr2 = f.readByte(); ++byteCount; - for (int i = 0; i < len + 2; ++i, xPos += 2) { - *destP++ = opr1; - *destP++ = opr2; - } - break; - - case 5: // Skip len + 1 pixels filling them with the transparent color. - xPos += len + 1; - destP += len + 1; - break; - - case 6: // Pattern command. - case 7: - // The pattern command has a different opcode format - len = opcode & 0x07; - cmd = (opcode >> 2) & 0x0E; - - opr1 = f.readByte(); ++byteCount; - for (int i = 0; i < len + 3; ++i, ++xPos) { - *destP++ = opr1; - opr1 += patternSteps[cmd + (i % 2)]; - } - break; - default: - break; - } - } - - assert(byteCount == lineLength); - } +const char *const CREDITS = + "\013012\010000\003c\01435Designed and Directed By:\n" + "\01417Jon Van Caneghem\003l\n" + "\n" + "\t025\01435Programming:\n" + "\t035\01417Mark Caldwell\n" + "\t035Dave Hathaway\n" + "\n" + "\t025\01435Sound System & FX:\n" + "\t035\01417Mike Heilemann\n" + "\n" + "\t025\01435Music & Speech:\n" + "\t035\01417Tim Tully\n" + "\n" + "\t025\01435Writing:\n" + "\t035\01417Paul Rattner\n" + "\t035Debbie Van Caneghem\n" + "\t035Jon Van Caneghem\013012\n" + "\n" + "\n" + "\t180\01435Graphics:\n" + "\t190\01417Jonathan P. Gwyn\n" + "\t190Bonita Long-Hemsath\n" + "\t190Julia Ulano\n" + "\t190Ricardo Barrera\n" + "\n" + "\t180\01435Testing:\n" + "\t190\01417Benjamin Bent\n" + "\t190Christian Dailey\n" + "\t190Mario Escamilla\n" + "\t190Marco Hunter\n" + "\t190Robert J. Lupo\n" + "\t190Clayton Retzer\n" + "\t190David Vela\003c"; + +const char *const OPTIONS_TITLE = + "\x0D\x01\003c\014dMight and Magic Options\n" + "World of Xeen\x02\n" + "\v117Copyright (c) 1993 NWC, Inc.\n" + "All Rights Reserved\x01"; + +const byte SYMBOLS[20][64] = { + { // 0 + 0x00, 0x00, 0xA8, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x00, 0xA8, 0x9E, 0x9C, 0x9C, 0x9E, 0x9E, 0x9E, + 0xAC, 0x9C, 0xA4, 0xAC, 0xAC, 0x9A, 0x9A, 0x9A, 0xAC, 0x9E, 0xAC, 0xA8, 0xA8, 0xA6, 0x97, 0x98, + 0xAC, 0xA0, 0xAC, 0xAC, 0xA4, 0xA6, 0x98, 0x99, 0x00, 0xAC, 0xA0, 0xA0, 0xA8, 0xAC, 0x9A, 0x9A, + 0x00, 0x00, 0xAC, 0xAC, 0xAC, 0xA4, 0x9B, 0x9A, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xA0, 0x9B, 0x9B, + }, + { // 1 + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, + 0x99, 0x9A, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0x99, 0x98, 0x98, 0x98, 0x97, 0x97, 0x97, 0x97, 0x97, + 0x99, 0x98, 0x98, 0x99, 0x98, 0x98, 0x99, 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9B, 0x9B, 0x9C, 0x9B, 0x9A, 0x9C, 0x9A, 0x9B, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0x9A, 0x9B, + }, + { // 2 + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, + 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x99, 0x98, 0x98, 0x99, 0x98, 0x98, 0x97, 0x98, 0x98, + 0x99, 0x98, 0x98, 0x98, 0x99, 0x99, 0x98, 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9B, 0x9B, 0x9C, 0x9C, 0x9B, 0x9B, 0x9B, 0x9B, 0x99, 0x9A, 0x9B, 0x9B, 0x9A, 0x9A, 0x99, 0x9A, + }, + { // 3 + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, + 0x99, 0x9A, 0x9A, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0x98, 0x98, 0x97, 0x97, 0x98, 0x98, 0x98, 0x98, + 0x99, 0x99, 0x98, 0x99, 0x98, 0x98, 0x99, 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9B, 0x9C, 0x9B, 0x9B, 0x9C, 0x9C, 0x9C, 0x9C, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x99, 0x99, 0x9A, + }, + { // 4 + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, + 0x9A, 0x9A, 0x9A, 0x99, 0x99, 0x99, 0x99, 0x9A, 0x97, 0x97, 0x97, 0x97, 0x97, 0x98, 0x98, 0x98, + 0x99, 0x99, 0x98, 0x99, 0x99, 0x98, 0x98, 0x98, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9C, 0x9B, 0x9B, 0x9C, 0x9B, 0x9B, 0x9B, 0x9A, 0x99, 0x9B, 0x9B, 0x9A, 0x99, 0x9A, 0x9A, + }, + { // 5 + 0xA4, 0xA4, 0xA8, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x9E, 0x9E, 0xA0, 0xA8, 0xAC, 0x00, 0x00, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9E, 0xAC, 0x00, 0x97, 0x97, 0x97, 0x98, 0x9C, 0x9C, 0xA0, 0xAC, + 0x99, 0x98, 0x99, 0x99, 0x99, 0x9B, 0xA0, 0xAC, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9B, 0xA0, 0xAC, + 0x9C, 0x9B, 0x9C, 0x9C, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x9A, 0x9A, 0x9B, 0x9B, 0xA4, 0xAC, 0x00, + }, + { // 6 + 0x00, 0x00, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x00, 0x00, 0x00, 0xAC, 0xA0, 0x9C, 0x9B, 0x99, + 0x00, 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x98, 0x99, 0x99, + 0x00, 0xAC, 0xA0, 0x9C, 0x9C, 0xA0, 0x9C, 0x9A, 0x00, 0x00, 0xAC, 0xA4, 0xA0, 0x99, 0x99, 0x99, + 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, + }, + { // 7 + 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x00, 0x00, 0xAC, 0xA4, 0x9C, 0x9C, 0x99, 0x99, + 0x00, 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x00, 0x00, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x99, + 0x00, 0x00, 0xAC, 0xA0, 0x9B, 0xA0, 0x9E, 0x9C, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x9C, 0x99, 0x99, + }, + { // 8 + 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x9B, 0x99, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, + 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x9C, 0x99, 0x00, 0xAC, 0xA4, 0x9C, 0x99, 0x9E, 0x9C, 0x99, + }, + { // 9 + 0x00, 0x00, 0xAC, 0xA4, 0xA0, 0x9C, 0x99, 0x99, 0x00, 0xAC, 0xA0, 0x9C, 0x9C, 0xA0, 0x9C, 0x9A, + 0xAC, 0xA4, 0x9C, 0x9A, 0x99, 0x99, 0x99, 0x99, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, + 0xAC, 0xA4, 0x9C, 0x99, 0x99, 0x99, 0x99, 0x99, 0x00, 0xAC, 0xA0, 0x9C, 0x99, 0x99, 0x99, 0x99, + 0x00, 0xAC, 0xA4, 0x9C, 0x9A, 0x9C, 0x99, 0x99, 0x00, 0x00, 0xAC, 0xA0, 0x9C, 0x9A, 0x99, 0x99, + }, + { // 10 + 0x99, 0x99, 0x99, 0x9A, 0xA0, 0xAC, 0x00, 0x00, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x00, + 0x99, 0x99, 0x9C, 0x9E, 0xA4, 0xAC, 0x00, 0x00, 0x99, 0x99, 0x9C, 0x99, 0x9C, 0xA4, 0xAC, 0x00, + 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x00, + 0x99, 0x99, 0x99, 0xA0, 0xA4, 0xAC, 0x00, 0x00, 0x9A, 0x9B, 0x9E, 0x9C, 0x9C, 0xA4, 0xAC, 0x00, + }, + { // 11 + 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0x9E, 0xAC, + 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA4, 0xAC, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, + 0x9C, 0x99, 0x99, 0x99, 0x9C, 0x9C, 0xA4, 0xAC, 0x99, 0x9E, 0x9E, 0x9C, 0x9C, 0xA0, 0xAC, 0x00, + }, + { // 12 + 0x99, 0x99, 0x9C, 0xA0, 0xA4, 0xAC, 0x00, 0x00, 0x9B, 0x9C, 0x9E, 0x9C, 0x9C, 0xA4, 0xAC, 0x00, + 0x99, 0x99, 0x99, 0x99, 0x99, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, + 0x99, 0x99, 0x99, 0x99, 0x9C, 0x9C, 0xA4, 0xAC, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xA4, 0xAC, 0x00, + 0x99, 0x99, 0x9C, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, + }, + { // 13 + 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, 0x00, 0x00, + 0x99, 0x9B, 0x9C, 0xA0, 0xA4, 0xAC, 0x00, 0x00, 0x99, 0x99, 0x9A, 0x99, 0x9C, 0xA0, 0xAC, 0x00, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA4, 0xAC, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9C, 0xA0, 0xAC, + 0x99, 0x99, 0x99, 0x99, 0x9A, 0x9C, 0xA4, 0xAC, 0x99, 0x99, 0x99, 0x9A, 0x9C, 0xA4, 0xAC, 0x00, + }, + { // 14 + 0x00, 0x00, 0xAC, 0x9E, 0x9C, 0x9C, 0x9C, 0x9B, 0x00, 0xAC, 0x9C, 0xA0, 0x9E, 0xA4, 0xA4, 0xA4, + 0xAC, 0x9C, 0xA4, 0xAC, 0xAC, 0xAC, 0x9C, 0x9E, 0xAC, 0xA0, 0xAC, 0xA8, 0x9E, 0xA8, 0xAC, 0x99, + 0xAC, 0x9E, 0xAC, 0xA8, 0xAC, 0x9E, 0xA4, 0xAC, 0xAC, 0xA4, 0xA0, 0xAC, 0xAC, 0xA0, 0xA4, 0xAC, + 0x00, 0xAC, 0xA4, 0xA0, 0xA0, 0xA4, 0xAC, 0xA4, 0x00, 0x00, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, + }, + { // 15 + 0x9C, 0x9C, 0x9C, 0x9B, 0x9C, 0x9C, 0x9C, 0x9B, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0x9E, 0x9E, 0x9E, 0x9C, 0x9E, 0x9E, 0x9E, 0x9E, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x99, 0x98, + 0x9C, 0x9C, 0x9B, 0x9B, 0x9B, 0x9C, 0x9C, 0x9C, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0x9E, 0x9E, 0xA0, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, + }, + { // 16 + 0x9B, 0x9B, 0x9B, 0x9B, 0x9C, 0x9B, 0x9C, 0x9C, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9E, 0x98, 0x98, 0x98, 0x98, 0x99, 0x99, 0x99, 0x99, + 0x9C, 0x9B, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0xA0, 0xA0, 0xA0, 0x9E, 0xA0, 0x9E, 0x9E, 0xA0, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, + }, + { // 17 + 0x9C, 0x9C, 0x9C, 0x9B, 0x9B, 0x9B, 0x9C, 0x9B, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0x9E, 0x9E, 0x9E, 0x9C, 0x9C, 0x9C, 0x9E, 0x9E, 0x98, 0x98, 0x98, 0x99, 0x9A, 0x9A, 0x99, 0x98, + 0x9C, 0x9B, 0x9C, 0x9C, 0x9C, 0x9B, 0x9B, 0x9C, 0xA0, 0x9E, 0x9E, 0xA0, 0xA0, 0xA0, 0xA0, 0x9E, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, + }, + { // 18 + 0x9B, 0x9B, 0x9C, 0x9C, 0x9C, 0x9B, 0x9B, 0x9B, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, + 0x9E, 0x9E, 0x9E, 0x9E, 0x9C, 0x9C, 0x9C, 0x9E, 0x98, 0x98, 0x98, 0x98, 0x9A, 0x9A, 0x98, 0x99, + 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9B, 0x9C, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0xA0, 0xA0, 0xA0, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, + }, + { // 19 + 0x9C, 0x9B, 0x9C, 0x9C, 0xA0, 0xA4, 0xAC, 0x00, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0x00, 0x00, + 0x9E, 0x9E, 0x9C, 0x9C, 0x9E, 0xA0, 0xAC, 0x00, 0x99, 0x98, 0x98, 0x99, 0x9A, 0x9A, 0xA0, 0xAC, + 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0xA0, 0xAC, 0xA0, 0xA0, 0x9E, 0xA0, 0xA0, 0xA0, 0xA0, 0xAC, + 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xAC, 0x00, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0x00, 0x00, } +}; - dest.addDirtyRect(Common::Rect(destPos.x + xOffset, destPos.y + yOffset, - destPos.x + xOffset + width, destPos.y + yOffset + height)); -} - -/*------------------------------------------------------------------------*/ - -FramesResource::FramesResource(const Common::String &filename) : - GraphicResource(filename) { - // Read in the index - Common::MemoryReadStream f(_data, _filesize); - int count = f.readUint16LE(); - _index.resize(count); - - for (int i = 0; i < count; ++i) { - _index[i] = f.readUint32LE(); - } -} - -void FramesResource::draw(XSurface &dest, int frame, const Common::Point &destPos) const { - drawOffset(dest, _index[frame], destPos); -} - -void FramesResource::draw(XSurface &dest, int frame) const { - draw(dest, frame, Common::Point()); -} - -/*------------------------------------------------------------------------*/ - -SpriteResource::SpriteResource(const Common::String &filename) : - GraphicResource(filename) { - // Read in the index - Common::MemoryReadStream f(_data, _filesize); - int count = f.readUint16LE(); - _index.resize(count); - - for (int i = 0; i < count; ++i) { - _index[i]._offset1 = f.readUint16LE(); - _index[i]._offset2 = f.readUint16LE(); - } -} - -void SpriteResource::draw(XSurface &dest, int frame, const Common::Point &destPos) const { - drawOffset(dest, _index[frame]._offset1, destPos); - if (_index[frame]._offset2) - drawOffset(dest, _index[frame]._offset2, destPos); -} - -void SpriteResource::draw(XSurface &dest, int frame) const { - draw(dest, frame, Common::Point()); -} +const byte TEXT_COLORS[40][4] = { + { 0x00, 0x19, 0x19, 0x19 }, + { 0x00, 0x08, 0x08, 0x08 }, + { 0x00, 0x0F, 0x0F, 0x0F }, + { 0x00, 0x15, 0x15, 0x15 }, + { 0x00, 0x01, 0x01, 0x01 }, + { 0x00, 0x21, 0x21, 0x21 }, + { 0x00, 0x26, 0x26, 0x26 }, + { 0x00, 0x2B, 0x2B, 0x2B }, + { 0x00, 0x31, 0x31, 0x31 }, + { 0x00, 0x36, 0x36, 0x36 }, + { 0x00, 0x3D, 0x3D, 0x3D }, + { 0x00, 0x41, 0x41, 0x41 }, + { 0x00, 0x46, 0x46, 0x46 }, + { 0x00, 0x4C, 0x4C, 0x4C }, + { 0x00, 0x50, 0x50, 0x50 }, + { 0x00, 0x55, 0x55, 0x55 }, + { 0x00, 0x5D, 0x5D, 0x5D }, + { 0x00, 0x60, 0x60, 0x60 }, + { 0x00, 0x65, 0x65, 0x65 }, + { 0x00, 0x6C, 0x6C, 0x6C }, + { 0x00, 0x70, 0x70, 0x70 }, + { 0x00, 0x75, 0x75, 0x75 }, + { 0x00, 0x7B, 0x7B, 0x7B }, + { 0x00, 0x80, 0x80, 0x80 }, + { 0x00, 0x85, 0x85, 0x85 }, + { 0x00, 0x8D, 0x8D, 0x8D }, + { 0x00, 0x90, 0x90, 0x90 }, + { 0x00, 0x97, 0x97, 0x97 }, + { 0x00, 0x9D, 0x9D, 0x9D }, + { 0x00, 0xA4, 0xA4, 0xA4 }, + { 0x00, 0xAB, 0xAB, 0xAB }, + { 0x00, 0xB0, 0xB0, 0xB0 }, + { 0x00, 0xB6, 0xB6, 0xB6 }, + { 0x00, 0xBD, 0xBD, 0xBD }, + { 0x00, 0xC0, 0xC0, 0xC0 }, + { 0x00, 0xC6, 0xC6, 0xC6 }, + { 0x00, 0xCD, 0xCD, 0xCD }, + { 0x00, 0xD0, 0xD0, 0xD0 }, + { 0x00, 0xD6, 0xD6, 0xD6 }, + { 0x00, 0xDB, 0xDB, 0xDB }, +}; } // End of namespace Xeen diff --git a/engines/xeen/resources.h b/engines/xeen/resources.h index 0476319875..d24b1fe4bf 100644 --- a/engines/xeen/resources.h +++ b/engines/xeen/resources.h @@ -8,12 +8,12 @@ * 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. @@ -24,84 +24,18 @@ #define XEEN_RESOURCES_H #include "common/scummsys.h" -#include "common/array.h" -#include "common/file.h" -#include "graphics/surface.h" -#include "xeen/xsurface.h" +#include "gui/debugger.h" namespace Xeen { -class XeenEngine; - -class Resources { -public: - /** - * Instantiates the resource manager - */ - static void init(XeenEngine *vm); -}; - -/** - * Derived file class - */ -class File : public Common::File { -public: - File() : Common::File() {} - File(const Common::String &filename) { openFile(filename); } - virtual ~File() {} - - void openFile(const Common::String &filename); -}; - -class GraphicResource { -protected: - int32 _filesize; - byte *_data; - - void drawOffset(XSurface &dest, uint16 offset, const Common::Point &destPos) const; -public: - GraphicResource(const Common::String &filename); - - virtual ~GraphicResource(); - - int size() const; -}; - -/** - * Defines a resource that Contains a list of singular sprite frames - */ -class FramesResource : public GraphicResource { -private: - Common::Array _index; -public: - FramesResource(const Common::String &filename); - virtual ~FramesResource() {} - - void draw(XSurface &dest, int frame, const Common::Point &destPos) const; - - void draw(XSurface &dest, int frame) const; -}; - -/** - * Defines a resource that contains sets of two layered sprites per frame - */ -class SpriteResource : public GraphicResource { -private: - struct IndexEntry { - uint16 _offset1, _offset2; - }; - Common::Array _index; - -public: - SpriteResource(const Common::String &filename); +extern const char *const CREDITS; - virtual ~SpriteResource() {} +extern const char *const OPTIONS_TITLE; - void draw(XSurface &dest, int frame, const Common::Point &destPos) const; +extern const byte SYMBOLS[20][64]; - void draw(XSurface &dest, int frame) const; -}; +extern const byte TEXT_COLORS[40][4]; } // End of namespace Xeen -#endif /* MADS_RESOURCES_H */ +#endif /* XEEN_RESOURCES_H */ diff --git a/engines/xeen/sound.h b/engines/xeen/sound.h index 73f5aa0633..f375b985f8 100644 --- a/engines/xeen/sound.h +++ b/engines/xeen/sound.h @@ -25,7 +25,7 @@ #include "common/scummsys.h" #include "common/system.h" -#include "xeen/resources.h" +#include "xeen/files.h" namespace Xeen { diff --git a/engines/xeen/sprites.cpp b/engines/xeen/sprites.cpp new file mode 100644 index 0000000000..1b18e98dfd --- /dev/null +++ b/engines/xeen/sprites.cpp @@ -0,0 +1,201 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/scummsys.h" +#include "common/archive.h" +#include "common/memstream.h" +#include "common/textconsole.h" +#include "xeen/xeen.h" +#include "xeen/sprites.h" + +namespace Xeen { + +GraphicResource::GraphicResource(const Common::String &filename) { + // Open the resource + File f(filename); + + // Read in a copy of the file + _filesize = f.size(); + _data = new byte[_filesize]; + f.seek(0); + f.read(_data, _filesize); +} + +GraphicResource::~GraphicResource() { + delete[] _data; +} + +int GraphicResource::size() const { + return READ_LE_UINT16(_data); +} + +void GraphicResource::drawOffset(XSurface &dest, uint16 offset, const Common::Point &destPos) const { + // Get cell header + Common::MemoryReadStream f(_data, _filesize); + f.seek(offset); + int xOffset = f.readUint16LE(); + int width = f.readUint16LE(); + int yOffset = f.readUint16LE(); + int height = f.readUint16LE(); + + if (dest.w < (xOffset + width) || dest.h < (yOffset + height)) + dest.create(xOffset + width, yOffset + height); + + // The pattern steps used in the pattern command + const int patternSteps[] = { 0, 1, 1, 1, 2, 2, 3, 3, 0, -1, -1, -1, -2, -2, -3, -3 }; + + // Main loop + int opr1, opr2; + int32 pos; + for (int yPos = yOffset, byteCount = 0; yPos < height + yOffset; yPos++, byteCount = 0) { + // The number of bytes in this scan line + int lineLength = f.readByte(); + + if (lineLength == 0) { + // Skip the specified number of scan lines + yPos += f.readByte(); + } else { + // Skip the transparent pixels at the beginning of the scan line + int xPos = f.readByte() + xOffset; ++byteCount; + byte *destP = (byte *)dest.getBasePtr(destPos.x + xPos, destPos.y + yPos); + + while (byteCount < lineLength) { + // The next byte is an opcode that determines what + // operators are to follow and how to interpret them. + int opcode = f.readByte(); ++byteCount; + + // Decode the opcode + int len = opcode & 0x1F; + int cmd = (opcode & 0xE0) >> 5; + + switch (cmd) { + case 0: // The following len + 1 bytes are stored as indexes into the color table. + case 1: // The following len + 33 bytes are stored as indexes into the color table. + for (int i = 0; i < opcode + 1; ++i, ++xPos) { + *destP++ = f.readByte(); ++byteCount; + } + break; + + case 2: // The following byte is an index into the color table, draw it len + 3 times. + opr1 = f.readByte(); ++byteCount; + for (int i = 0; i < len + 3; ++i, ++xPos) + *destP++ = opr1; + break; + + case 3: // Stream copy command. + opr1 = f.readUint16LE(); byteCount += 2; + pos = f.pos(); + f.seek(-opr1, SEEK_CUR); + + for (int i = 0; i < len + 4; ++i, ++xPos) + *destP++ = f.readByte(); + + f.seek(pos, SEEK_SET); + break; + + case 4: // The following two bytes are indexes into the color table, draw the pair len + 2 times. + opr1 = f.readByte(); ++byteCount; + opr2 = f.readByte(); ++byteCount; + for (int i = 0; i < len + 2; ++i, xPos += 2) { + *destP++ = opr1; + *destP++ = opr2; + } + break; + + case 5: // Skip len + 1 pixels filling them with the transparent color. + xPos += len + 1; + destP += len + 1; + break; + + case 6: // Pattern command. + case 7: + // The pattern command has a different opcode format + len = opcode & 0x07; + cmd = (opcode >> 2) & 0x0E; + + opr1 = f.readByte(); ++byteCount; + for (int i = 0; i < len + 3; ++i, ++xPos) { + *destP++ = opr1; + opr1 += patternSteps[cmd + (i % 2)]; + } + break; + default: + break; + } + } + + assert(byteCount == lineLength); + } + } + + dest.addDirtyRect(Common::Rect(destPos.x + xOffset, destPos.y + yOffset, + destPos.x + xOffset + width, destPos.y + yOffset + height)); +} + +/*------------------------------------------------------------------------*/ + +FramesResource::FramesResource(const Common::String &filename) : + GraphicResource(filename) { + // Read in the index + Common::MemoryReadStream f(_data, _filesize); + int count = f.readUint16LE(); + _index.resize(count); + + for (int i = 0; i < count; ++i) { + _index[i] = f.readUint32LE(); + } +} + +void FramesResource::draw(XSurface &dest, int frame, const Common::Point &destPos) const { + drawOffset(dest, _index[frame], destPos); +} + +void FramesResource::draw(XSurface &dest, int frame) const { + draw(dest, frame, Common::Point()); +} + +/*------------------------------------------------------------------------*/ + +SpriteResource::SpriteResource(const Common::String &filename) : + GraphicResource(filename) { + // Read in the index + Common::MemoryReadStream f(_data, _filesize); + int count = f.readUint16LE(); + _index.resize(count); + + for (int i = 0; i < count; ++i) { + _index[i]._offset1 = f.readUint16LE(); + _index[i]._offset2 = f.readUint16LE(); + } +} + +void SpriteResource::draw(XSurface &dest, int frame, const Common::Point &destPos) const { + drawOffset(dest, _index[frame]._offset1, destPos); + if (_index[frame]._offset2) + drawOffset(dest, _index[frame]._offset2, destPos); +} + +void SpriteResource::draw(XSurface &dest, int frame) const { + draw(dest, frame, Common::Point()); +} + +} // End of namespace Xeen diff --git a/engines/xeen/sprites.h b/engines/xeen/sprites.h new file mode 100644 index 0000000000..6c01a9ff82 --- /dev/null +++ b/engines/xeen/sprites.h @@ -0,0 +1,87 @@ +/* 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. + * + */ + +#ifndef XEEN_SPRITES_H +#define XEEN_SPRITES_H + +#include "common/scummsys.h" +#include "common/array.h" +#include "common/file.h" +#include "graphics/surface.h" +#include "xeen/xsurface.h" + +namespace Xeen { + +class XeenEngine; + +class GraphicResource { +protected: + int32 _filesize; + byte *_data; + + void drawOffset(XSurface &dest, uint16 offset, const Common::Point &destPos) const; +public: + GraphicResource(const Common::String &filename); + + virtual ~GraphicResource(); + + int size() const; +}; + +/** + * Defines a resource that Contains a list of singular sprite frames + */ +class FramesResource : public GraphicResource { +private: + Common::Array _index; +public: + FramesResource(const Common::String &filename); + virtual ~FramesResource() {} + + void draw(XSurface &dest, int frame, const Common::Point &destPos) const; + + void draw(XSurface &dest, int frame) const; +}; + +/** + * Defines a resource that contains sets of two layered sprites per frame + */ +class SpriteResource : public GraphicResource { +private: + struct IndexEntry { + uint16 _offset1, _offset2; + }; + Common::Array _index; + +public: + SpriteResource(const Common::String &filename); + + virtual ~SpriteResource() {} + + void draw(XSurface &dest, int frame, const Common::Point &destPos) const; + + void draw(XSurface &dest, int frame) const; +}; + +} // End of namespace Xeen + +#endif /* MADS_SPRITES_H */ diff --git a/engines/xeen/xeen.cpp b/engines/xeen/xeen.cpp index cbdb6f3104..b61d6a6cc2 100644 --- a/engines/xeen/xeen.cpp +++ b/engines/xeen/xeen.cpp @@ -29,7 +29,7 @@ #include "graphics/thumbnail.h" #include "xeen/xeen.h" #include "xeen/dialogs_options.h" -#include "xeen/resources.h" +#include "xeen/files.h" namespace Xeen { @@ -58,7 +58,7 @@ void XeenEngine::initialize() { DebugMan.addDebugChannel(kDebugSound, "sound", "Sound and Music handling"); // Create sub-objects of the engine - Resources::init(this); + FileManager::init(this); _debugger = new Debugger(this); _events = new EventsManager(this); _screen = new Screen(this); diff --git a/engines/xeen/xsurface.cpp b/engines/xeen/xsurface.cpp index dc42a6fb24..698e478aee 100644 --- a/engines/xeen/xsurface.cpp +++ b/engines/xeen/xsurface.cpp @@ -23,7 +23,7 @@ #include "common/algorithm.h" #include "common/util.h" #include "xeen/xsurface.h" -#include "xeen/resdata.h" +#include "xeen/resources.h" namespace Xeen { -- cgit v1.2.3