diff options
| author | Kamil Zbróg | 2013-11-09 23:07:40 +0000 | 
|---|---|---|
| committer | Kamil Zbróg | 2013-11-09 23:07:40 +0000 | 
| commit | cdc1409dc77c57b083a60e6118c29dd9aad0be9b (patch) | |
| tree | 7725569208d9bc607a89ed3a46ee8e72739bf5e5 | |
| parent | 6c0cd59dff1139ff56c366fb3d5d04b3e998d42e (diff) | |
| download | scummvm-rg350-cdc1409dc77c57b083a60e6118c29dd9aad0be9b.tar.gz scummvm-rg350-cdc1409dc77c57b083a60e6118c29dd9aad0be9b.tar.bz2 scummvm-rg350-cdc1409dc77c57b083a60e6118c29dd9aad0be9b.zip | |
PRINCE: databank.ptc base archive with decompression
| -rw-r--r-- | engines/prince/archive.cpp | 122 | ||||
| -rw-r--r-- | engines/prince/archive.h | 33 | ||||
| -rw-r--r-- | engines/prince/debugger.cpp | 5 | ||||
| -rw-r--r-- | engines/prince/debugger.h | 2 | ||||
| -rw-r--r-- | engines/prince/decompress.cpp | 169 | ||||
| -rw-r--r-- | engines/prince/decompress.h | 42 | ||||
| -rw-r--r-- | engines/prince/mob.h | 3 | ||||
| -rw-r--r-- | engines/prince/module.mk | 6 | ||||
| -rw-r--r-- | engines/prince/object.cpp | 2 | ||||
| -rw-r--r-- | engines/prince/prince.cpp | 116 | ||||
| -rw-r--r-- | engines/prince/prince.h | 19 | ||||
| -rw-r--r-- | engines/prince/sound.cpp | 2 | 
12 files changed, 458 insertions, 63 deletions
| diff --git a/engines/prince/archive.cpp b/engines/prince/archive.cpp index b474c95172..2cf3126f0c 100644 --- a/engines/prince/archive.cpp +++ b/engines/prince/archive.cpp @@ -21,3 +21,125 @@   */  #include "prince/archive.h" +#include "prince/decompress.h" + +#include "common/stream.h" +#include "common/debug.h" +#include "common/memstream.h" + +namespace Prince { + +PtcArchive::PtcArchive() : _stream(NULL) { +} + +PtcArchive::~PtcArchive() { +	close(); +} + +static void decrypt(byte *buffer, uint32 size) { +    uint32 key = 0xDEADF00D; +    while (size--) { +        *buffer++ += key & 0xFF; +        key ^= 0x2E84299A; +        key += 0x424C4148; +        key = ((key & 1) << 31) | (key >> 1); +    } +} + +bool PtcArchive::open(const Common::String &filename) { +	_stream = SearchMan.createReadStreamForMember(filename); +	if (!_stream) +		return false; + +	uint32 magic = _stream->readUint32LE(); +	uint32 fileTableOffset = _stream->readUint32LE() ^ 0x4D4F4B2D; // MOK- +	uint32 fileTableSize = _stream->readUint32LE() ^ 0x534F4654; // SOFT + +    debug("fileTableOffset : %08X", fileTableOffset); +    debug("fileTableSize: %08X", fileTableSize); + +	_stream->seek(fileTableOffset); + +    byte *fileTable = new byte[fileTableSize]; +    byte *fileTableEnd = fileTable + fileTableSize; +    _stream->read(fileTable, fileTableSize); +    decrypt(fileTable, fileTableSize); +     +    for (byte *fileItem = fileTable; fileItem < fileTableEnd; fileItem += 32) { +    	FileEntry item; +		Common::String name = (const char*)fileItem; +        item._offset = READ_LE_UINT32(fileItem + 24); +        item._size = READ_LE_UINT32(fileItem + 28); +        debug("%12s %8X %d", name.c_str(), item._offset, item._size); +		_items[name] = item; +	} +     +    delete[] fileTable; + +	return true; +} + +void PtcArchive::close() { +	delete _stream; +	_stream = NULL; +	_items.clear(); +} + +bool PtcArchive::hasFile(const Common::String &name) const { +	return _items.contains(name); +} + +int PtcArchive::listMembers(Common::ArchiveMemberList &list) const { +	int matches = 0; + +	for (FileMap::const_iterator it = _items.begin(); it != _items.end(); ++it) { +		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(it->_key, this))); +		matches++; +	} + +	return matches; +} + +const Common::ArchiveMemberPtr PtcArchive::getMember(const Common::String &name) const { +	if (!_items.contains(name)) { +		Common::ArchiveMemberPtr(); +	} +	return Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(name, this)); +} + +Common::SeekableReadStream *PtcArchive::createReadStreamForMember(const Common::String &name) const { +	if (!_items.contains(name)) { +		return 0; +	} + +	const FileEntry &entryHeader = _items[name]; + +	if (entryHeader._size < 4) +		return 0; + +	uint32 size = entryHeader._size; + +	_stream->seek(entryHeader._offset); + +	// This *HAS* to be malloc (not new[]) because MemoryReadStream uses free() to free the memory +	byte* buffer = (byte *)malloc(size); +	_stream->read(buffer, size); + +	if (READ_BE_UINT32(buffer) == 0x4D41534D) { +		Decompressor dec; +		uint32 decompLen = READ_BE_UINT32(buffer + 14); +		byte *decompData = (byte*)malloc(decompLen); +		dec.decompress(buffer + 18, decompData, decompLen); +		free(buffer); +		size = decompLen; +		buffer = decompData; +	} + +	debug("PtcArchive::createReadStreamForMember name %s", name.c_str()); + +	return new Common::MemoryReadStream(buffer, size, DisposeAfterUse::YES); +} + +} + +/* vim: set tabstop=4 noexpandtab: */ diff --git a/engines/prince/archive.h b/engines/prince/archive.h index 94503b65ce..29d3d58560 100644 --- a/engines/prince/archive.h +++ b/engines/prince/archive.h @@ -24,13 +24,40 @@  #define PRINCE_ARCHIVE_H  #include "common/archive.h" +#include "common/hashmap.h" +#include "common/hash-str.h" -// This is here just as remainder that archive support is missing -namespace Price { +namespace Prince {  class PtcArchive : public Common::Archive { +public: +	PtcArchive(); +	~PtcArchive(); + +	bool open(const Common::String &filename); +	void close(); +	bool isOpen() const { return _stream != 0; } + +	// Common::Archive API implementation +	bool hasFile(const Common::String &name) const; +	int listMembers(Common::ArchiveMemberList &list) const; +	const Common::ArchiveMemberPtr getMember(const Common::String &name) const; +	Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const; + +private: +	struct FileEntry { +		uint32 _offset; +		uint32 _size; +	}; + +	Common::SeekableReadStream *_stream; + +	typedef Common::HashMap<Common::String, FileEntry, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> FileMap; +	FileMap _items;  }; -} +} // End of namespace Prince  #endif + +/* vim: set tabstop=4 noexpandtab: */ diff --git a/engines/prince/debugger.cpp b/engines/prince/debugger.cpp index 449ba5001a..e04fa43215 100644 --- a/engines/prince/debugger.cpp +++ b/engines/prince/debugger.cpp @@ -25,7 +25,7 @@  namespace Prince { -Debugger::Debugger(PrinceEngine *vm) : GUI::Debugger(), _vm(vm) { +Debugger::Debugger(PrinceEngine *vm) : GUI::Debugger(), _vm(vm), _locationNr(0) {  	DCmd_Register("continue",		WRAP_METHOD(Debugger, Cmd_Exit));  	DCmd_Register("level",			WRAP_METHOD(Debugger, Cmd_DebugLevel));  	DCmd_Register("setflag",		WRAP_METHOD(Debugger, Cmd_SetFlag)); @@ -135,8 +135,7 @@ bool Debugger::Cmd_InitRoom(int argc, const char **argv) {  		return true;  	} -	int flagNum = strToInt(argv[1]); -	_vm->loadLocation(flagNum); +	_locationNr = strToInt(argv[1]);  	return true;  } diff --git a/engines/prince/debugger.h b/engines/prince/debugger.h index cbb6094668..edf89e8197 100644 --- a/engines/prince/debugger.h +++ b/engines/prince/debugger.h @@ -35,6 +35,8 @@ public:  	Debugger(PrinceEngine *vm);  	virtual ~Debugger() {}	// we need this for __SYMBIAN32__ archaic gcc/UIQ +	uint32 _locationNr; +  private:  	bool Cmd_DebugLevel(int argc, const char **argv);  	bool Cmd_SetFlag(int argc, const char **argv); diff --git a/engines/prince/decompress.cpp b/engines/prince/decompress.cpp new file mode 100644 index 0000000000..8eca653e0a --- /dev/null +++ b/engines/prince/decompress.cpp @@ -0,0 +1,169 @@ +/* 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 "prince/decompress.h"
 +
 +namespace Prince {
 +
 +static const uint16 table1[] = {
 +    0x8000, 0x0002,
 +    0x4000, 0x0004,
 +    0x2000, 0x0008,
 +    0x1000, 0x0010,
 +    0x0800, 0x0020,
 +    0x0400, 0x0040,
 +    0x0200, 0x0080,
 +    0x0100, 0x0100,
 +    0x0080, 0x0200,
 +    0x0040, 0x0400
 +};
 +
 +static const uint32 table2[] = {
 +    0x0000F000,
 +    0x0020FC00,
 +    0x00A0FF00,
 +    0x02A0FF80,
 +    0x06A0FFC0,
 +    0x0EA0FFE0,
 +    0x1EA0FFF0,
 +    0x3EA0FFF8
 +};
 +
 +static const uint16 table3[] = {
 +    0x8000, 0x0000,
 +    0x4000, 0x0002,
 +    0x2000, 0x0006,
 +    0x1000, 0x000E,
 +    0x0800, 0x001E,
 +    0x0400, 0x003E,
 +    0x0200, 0x007E,
 +    0x0100, 0x00FE,
 +    0x0080, 0x01FE,
 +    0x0040, 0x03FE,
 +    0x0020, 0x07FE,
 +    0x0010, 0x0FFE,
 +    0x0008, 0x1FFE,
 +    0x0004, 0x3FFE,
 +    0x0002, 0x7FFE,
 +    0x0001, 0xFFFE
 +};
 +
 +void Decompressor::decompress(byte *source, byte *dest, uint32 destSize) {
 +    byte *destEnd = dest + destSize;
 +    int more;
 +    _src = source;
 +    _dst = dest;
 +    _bitBuffer = 0x80;
 +    while (_dst < destEnd) {
 +        uint32 ebp;
 +        uint16 offset, length;
 +        if (getBit()) {
 +            if (getBit()) {
 +                if (getBit()) {
 +                    if (getBit()) {
 +                        if (getBit()) {
 +                            if (getBit()) {
 +                                uint32 tableIndex = 0;
 +                                while (getBit())
 +                                    tableIndex++;
 +                                length = table3[tableIndex * 2 + 0];
 +                                do {
 +                                    more = !(length & 0x8000);
 +                                    length = (length << 1) | getBit();
 +                                } while (more);
 +                                length += table3[tableIndex * 2 + 1];
 +                                length++;
 +                                memcpy(_dst, _src, length);
 +                                _src += length;
 +                                _dst += length;
 +                            }
 +                            *_dst++ = *_src++;
 +                        }
 +                        *_dst++ = *_src++;
 +                    }
 +                    *_dst++ = *_src++;
 +                }
 +                *_dst++ = *_src++;
 +            }
 +            *_dst++ = *_src++;
 +        }
 +        if (!getBit()) {
 +            if (getBit()) {
 +                uint32 tableIndex = getBit();
 +                tableIndex = (tableIndex << 1) | getBit();
 +                tableIndex = (tableIndex << 1) | getBit();
 +                ebp = table2[tableIndex];
 +                length = 1;
 +            } else {
 +                ebp = 0x0000FF00;
 +                length = 0;
 +            }
 +        } else {
 +            uint32 tableIndex = 0;
 +            while (getBit())
 +                tableIndex++;
 +            length = table1[tableIndex * 2 + 0];
 +            do {
 +                more = !(length & 0x8000);
 +                length = (length << 1) | getBit();
 +            } while (more);
 +            length += table1[tableIndex * 2 + 1];
 +            tableIndex = getBit();
 +            tableIndex = (tableIndex << 1) | getBit();
 +            tableIndex = (tableIndex << 1) | getBit();
 +            ebp = table2[tableIndex];
 +        }
 +        offset = ebp & 0xFFFF;
 +        do {
 +            if (_bitBuffer == 0x80) {
 +                if (offset >= 0xFF00) {
 +                    offset = (offset << 8) | *_src++;
 +                }
 +            }
 +            more = offset & 0x8000;
 +            offset = (offset << 1) | getBit();
 +        } while (more);
 +        offset += (ebp >> 16);
 +        length += 2;
 +        while (length--) {
 +            if (_dst >= destEnd) {
 +                return;
 +            }
 +            *_dst = *(_dst - offset);
 +            _dst++;
 +        }
 +    }
 +}
 +
 +int Decompressor::getBit() {
 +    int bit = (_bitBuffer & 0x80) >> 7;
 +    _bitBuffer <<= 1;
 +    if (_bitBuffer == 0) {
 +        _bitBuffer = *_src++;
 +        bit = (_bitBuffer & 0x80) >> 7;
 +        _bitBuffer <<= 1;
 +        _bitBuffer |= 1;
 +    }
 +    return bit;
 +}
 +
 +} // End of namespace Prince
 diff --git a/engines/prince/decompress.h b/engines/prince/decompress.h new file mode 100644 index 0000000000..19c7906eda --- /dev/null +++ b/engines/prince/decompress.h @@ -0,0 +1,42 @@ +/* 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 PRINCE_DECOMPRESS_H
 +#define PRINCE_DECOMPRESS_H
 +
 +#include "engines/util.h"
 +
 +namespace Prince {
 +
 +class Decompressor {
 +public:
 +	void decompress(byte *source, byte *dest, uint32 destSize);
 +protected:
 +	byte *_src, *_dst;
 +	byte _bitBuffer;
 +	int _bitsLeft;
 +	int getBit();
 +};
 +
 +} // End of namespace Prince
 +
 +#endif
 diff --git a/engines/prince/mob.h b/engines/prince/mob.h index b8208246a1..7db059e485 100644 --- a/engines/prince/mob.h +++ b/engines/prince/mob.h @@ -35,7 +35,8 @@ namespace Prince {  class Mob {  public: -	Mob() {} + +	Mob() : _name(""), _examText("") {}  	bool loadFromStream(Common::SeekableReadStream &stream); diff --git a/engines/prince/module.mk b/engines/prince/module.mk index 593c59dcff..48edcec9dd 100644 --- a/engines/prince/module.mk +++ b/engines/prince/module.mk @@ -12,8 +12,10 @@ MODULE_OBJS = \  	sound.o \  	flags.o \  	variatxt.o \ -	cursor.o \ -	prince.o +	prince.o \ +	archive.o \ +	decompress.o \ +	cursor.o   # This module can be built as a plugin  ifeq ($(ENABLE_PRINCE), DYNAMIC_PLUGIN) diff --git a/engines/prince/object.cpp b/engines/prince/object.cpp index 19dd7034a1..c4d8438926 100644 --- a/engines/prince/object.cpp +++ b/engines/prince/object.cpp @@ -36,7 +36,9 @@ Object::Object() : _surface(NULL), _x(0), _y(0), _z(0) {  }  Object::~Object() { +	_surface->free();  	delete _surface; +	_surface = NULL;  }  void Object::loadSurface(Common::SeekableReadStream &stream) { diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index d184f84518..005a829444 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -55,6 +55,7 @@  #include "prince/font.h"  #include "prince/mhwanh.h"  #include "prince/cursor.h" +#include "prince/archive.h"  namespace Prince { @@ -71,7 +72,7 @@ void PrinceEngine::debugEngine(const char *s, ...) {  PrinceEngine::PrinceEngine(OSystem *syst, const PrinceGameDescription *gameDesc) :   	Engine(syst), _gameDescription(gameDesc), _graph(NULL), _script(NULL), -	_locationNr(0), _debugger(NULL), _objectList(NULL), _mobList(NULL), _midiPlayer(NULL), +	_locationNr(0), _debugger(NULL), _midiPlayer(NULL),  	_cameraX(0), _newCameraX(0), _frameNr(0), _cursor1(NULL), _cursor2(NULL), _font(NULL),  	_walizkaBmp(NULL), _roomBmp(NULL), _voiceStream(NULL) { @@ -82,8 +83,6 @@ PrinceEngine::PrinceEngine(OSystem *syst, const PrinceGameDescription *gameDesc)  	DebugMan.enableDebugChannel("script");  	gDebugLevel = 10; - -  }  PrinceEngine::~PrinceEngine() { @@ -101,10 +100,6 @@ PrinceEngine::~PrinceEngine() {  	delete _variaTxt;  	delete[] _talkTxt;  	delete _graph; -	delete _mobList; -	delete _objectList; -	_midiPlayer->killMidi(); -	delete _midiPlayer;  }  GUI::Debugger *PrinceEngine::getDebugger() { @@ -127,11 +122,12 @@ bool loadFromStream<Graphics::BitmapDecoder>(Graphics::BitmapDecoder &image, Com  }  template<typename T> -bool loadResource(T *resource, const char *resourceName) { +bool loadResource(T *resource, const char *resourceName, bool required = true) {  	Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(resourceName);  	if (!stream) { -		error("Can't load %s", resourceName); -		return NULL; +		if (required)  +			error("Can't load %s", resourceName); +		return false;  	}  	bool ret = loadFromStream(*resource, *stream); @@ -141,44 +137,73 @@ bool loadResource(T *resource, const char *resourceName) {  	return ret;  }  -void PrinceEngine::init() { +template <typename T> +bool loadResource(Common::Array<T> &array, const char *resourceName, bool required = true) { +	Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(resourceName); +	if (!stream) { +		if (required) { +			error("Can't load %s", resourceName); +			return false; +		} +	} -	_graph = new GraphicsMan(this); +	typename Common::Array<T>::value_type t; +	while (t.loadFromStream(*stream)) +		array.push_back(t); -	_rnd = new Common::RandomSource("prince"); -	_debugger = new Debugger(this); -	_midiPlayer = new MusicPlayer(this); +	delete stream; +	return true; +} + +void PrinceEngine::init() {  	const Common::FSNode gameDataDir(ConfMan.get("path"));  	debugEngine("Adding all path: %s", gameDataDir.getPath().c_str()); +	PtcArchive *all = new PtcArchive(); +	if (!all->open("all/databank.ptc"))  +		error("Can't open all/databank.ptc"); + +	PtcArchive *voices = new PtcArchive(); +	if (!voices->open("data/voices/databank.ptc")) +		error("Can't open data/voices/databank.ptc"); + +	SearchMan.add("all", all); +	SearchMan.add("data/voices", voices); + +	_graph = new GraphicsMan(this); + +	_rnd = new Common::RandomSource("prince"); +	_debugger = new Debugger(this); +  	SearchMan.addSubDirectoryMatching(gameDataDir, "all", 0, 2); -	SearchMan.addSubDirectoryMatching(gameDataDir, "data/voices/output", 0, 2); +	SearchMan.addSubDirectoryMatching(gameDataDir, "data/voices", 0, 2); + +	_midiPlayer = new MusicPlayer(this);  	_font = new Font(); -	loadResource(_font, "font1.raw"); +	loadResource(_font, "all/font1.raw");  	_walizkaBmp = new MhwanhDecoder(); -	loadResource(_walizkaBmp, "walizka"); +	loadResource(_walizkaBmp, "all/walizka");  	_script = new Script(this); -	loadResource(_script, "skrypt.dat"); +	loadResource(_script, "all/skrypt.dat");  	_variaTxt = new VariaTxt(); -	loadResource(_variaTxt, "variatxt.dat"); +	loadResource(_variaTxt, "all/variatxt.dat");  	_cursor1 = new Cursor(); -	loadResource(_cursor1, "mouse1.cur"); +	loadResource(_cursor1, "all/mouse1.cur");  	_cursor2 = new Cursor(); -	loadResource(_cursor2, "mouse2.cur"); +	loadResource(_cursor2, "all/mouse2.cur"); -	Common::SeekableReadStream *talkTxtStream = SearchMan.createReadStreamForMember("talktxt.dat"); +	Common::SeekableReadStream *talkTxtStream = SearchMan.createReadStreamForMember("all/talktxt.dat");  	if (!talkTxtStream) {  		error("Can't load talkTxtStream");  		return;  	} -  	_talkTxtSize = talkTxtStream->size();  	_talkTxt = new byte[_talkTxtSize];  	talkTxtStream->read(_talkTxt, _talkTxtSize); @@ -202,12 +227,15 @@ Common::Error PrinceEngine::run() {  	showLogo(); +//	return Common::kNoError; +  	mainLoop();  	return Common::kNoError;  }  bool PrinceEngine::loadLocation(uint16 locationNr) { +	_debugger->_locationNr = locationNr;  	debugEngine("PrinceEngine::loadLocation %d", locationNr);  	const Common::FSNode gameDataDir(ConfMan.get("path"));  	SearchMan.remove(Common::String::format("%02d", _locationNr)); @@ -215,7 +243,12 @@ bool PrinceEngine::loadLocation(uint16 locationNr) {  	const Common::String locationNrStr = Common::String::format("%02d", _locationNr);  	debugEngine("loadLocation %s", locationNrStr.c_str()); -	SearchMan.addSubDirectoryMatching(gameDataDir, locationNrStr, 0, 2); + +	PtcArchive *locationArchive = new PtcArchive(); +	if (!locationArchive->open(locationNrStr + "/databank.ptc")) +		error("Can't open location %s", locationNrStr.c_str()); + +	SearchMan.add(locationNrStr, locationArchive);  	delete _roomBmp;  	// load location background @@ -225,14 +258,9 @@ bool PrinceEngine::loadLocation(uint16 locationNr) {  		_sceneWidth = _roomBmp->getSurface()->w;  	} -	delete _mobList; -	_mobList = new MobList(); +	_mobList.clear();  	loadResource(_mobList, "mob.lst"); -	delete _objectList; -	_objectList = new ObjectList(); -	loadResource(_objectList, "obj.lst"); -  	const char *musName = MusicPlayer::_musTable[MusicPlayer::_musRoomTable[locationNr]];  	_midiPlayer->loadMidi(musName); @@ -395,19 +423,18 @@ void PrinceEngine::keyHandler(Common::Event event) {  }  void PrinceEngine::hotspot() { -	if (!_mobList) -		return;  	Common::Point mousepos = _system->getEventManager()->getMousePos();  	Common::Point mousePosCamera(mousepos.x + _cameraX, mousepos.y); -	for (Common::Array<Mob>::const_iterator it = _mobList->_list.begin() -		; it != _mobList->_list.end() ; ++it) { -		if (it->_visible) +	for (Common::Array<Mob>::const_iterator it = _mobList.begin() +		; it != _mobList.end() ; ++it) { +		const Mob& mob = *it; +		if (mob._visible)  			continue; -		if (it->_rect.contains(mousePosCamera)) { +		if (mob._rect.contains(mousePosCamera)) {  			uint16 textW = 0; -			for (uint16 i = 0; i < it->_name.size(); ++i) -				textW += _font->getCharWidth(it->_name[i]); +			for (uint16 i = 0; i < mob._name.size(); ++i) +				textW += _font->getCharWidth(mob._name[i]);  			uint16 x = mousepos.x - textW/2;  			if (x > _graph->_frontScreen->w) @@ -418,7 +445,7 @@ void PrinceEngine::hotspot() {  			_font->drawString(  				_graph->_frontScreen,  -				it->_name,  +				mob._name,   				x,  				mousepos.y - _font->getFontHeight(),  				_graph->_frontScreen->w, @@ -500,6 +527,9 @@ void PrinceEngine::drawScreen() {  void PrinceEngine::mainLoop() { +	loadLocation(2); +	changeCursor(1); +  	while (!shouldQuit()) {  		uint32 currentTime = _system->getMillis(); @@ -530,7 +560,7 @@ void PrinceEngine::mainLoop() {  		if (shouldQuit())  			return; -		_script->step(); +		//_script->step();  		drawScreen();  		// Calculate the frame delay based off a desired frame time @@ -541,6 +571,10 @@ void PrinceEngine::mainLoop() {  		_cameraX = _newCameraX;  		++_frameNr; + +		if (_debugger->_locationNr != _locationNr) { +			loadLocation(_debugger->_locationNr); +		}  	}  } diff --git a/engines/prince/prince.h b/engines/prince/prince.h index 85ed3cec0e..2df8e66825 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -47,21 +47,14 @@  namespace Prince { - -template <typename ResourceType> -struct ResourceList { +#if 0  	bool loadFromStream(Common::SeekableReadStream &stream) { -		ResourceType resource; -		while (resource.loadFromStream(stream)) +		ResourceType *resource = new ResourceType(); +		while (resource->loadFromStream(stream))  			_list.push_back(resource);  		return true;  	} -	Common::Array<ResourceType> _list; -}; - -typedef ResourceList<Mob> MobList; -typedef ResourceList<Object> ObjectList; - +#endif  struct PrinceGameDescription;  class PrinceEngine; @@ -157,12 +150,12 @@ private:  	GraphicsMan *_graph;  	Script *_script;  	Font *_font; -	ObjectList *_objectList; -	MobList *_mobList;  	MusicPlayer *_midiPlayer;  	Audio::SoundHandle _soundHandle;  	Common::SeekableReadStream *_voiceStream; +	Common::Array<Mob> _mobList; +	Common::Array<Object *> _objectList;  	uint16 _cameraX;  	uint16 _newCameraX; diff --git a/engines/prince/sound.cpp b/engines/prince/sound.cpp index 40f182e630..fcdca8a0d1 100644 --- a/engines/prince/sound.cpp +++ b/engines/prince/sound.cpp @@ -168,6 +168,8 @@ void MusicPlayer::loadMidi(const char * name) {  	_data = (byte *)malloc(_dataSize);  	stream->read(_data, _dataSize); +    delete stream; +  	// Start playing the music  	sndMidiStart();  } | 
