diff options
author | johndoe123 | 2014-03-21 19:58:53 +0100 |
---|---|---|
committer | Eugene Sandulenko | 2018-07-20 06:43:33 +0000 |
commit | 812c7fc3a83f57b9ba181c47d3699155c16ab379 (patch) | |
tree | 02dc7789f53b9fb5163f0e17d37f073555773c7b /engines/illusions/talkresource.cpp | |
parent | 762be35a364fe66359d29b85b650c6e7add80e47 (diff) | |
download | scummvm-rg350-812c7fc3a83f57b9ba181c47d3699155c16ab379.tar.gz scummvm-rg350-812c7fc3a83f57b9ba181c47d3699155c16ab379.tar.bz2 scummvm-rg350-812c7fc3a83f57b9ba181c47d3699155c16ab379.zip |
ILLUSIONS: Add TalkResource and related
Diffstat (limited to 'engines/illusions/talkresource.cpp')
-rw-r--r-- | engines/illusions/talkresource.cpp | 98 |
1 files changed, 97 insertions, 1 deletions
diff --git a/engines/illusions/talkresource.cpp b/engines/illusions/talkresource.cpp index d0fa607518..fe14effd39 100644 --- a/engines/illusions/talkresource.cpp +++ b/engines/illusions/talkresource.cpp @@ -22,6 +22,7 @@ #include "illusions/illusions.h" #include "illusions/talkresource.h" +#include "illusions/dictionary.h" namespace Illusions { @@ -30,11 +31,30 @@ namespace Illusions { void TalkResourceLoader::load(Resource *resource) { debug("TalkResourceLoader::load() Loading font %08X from %s...", resource->_resId, resource->_filename.c_str()); - // TODO + TalkResource *talkResource = new TalkResource(); + talkResource->load(resource->_data, resource->_dataSize); + resource->_refId = talkResource; + + _vm->_talkItems->newTalkItem(resource->_resId, talkResource); + + for (uint i = 0; i < talkResource->_talkEntriesCount; ++i) { + TalkEntry *talkEntry = &talkResource->_talkEntries[i]; + _vm->_dict->addTalkEntry(talkEntry->_talkId, talkEntry); + } } void TalkResourceLoader::unload(Resource *resource) { + TalkItem *talkItem = _vm->_talkItems->findTalkItem(resource->_resId); + TalkResource *talkResource = talkItem->_talkRes; + + for (uint i = 0; i < talkResource->_talkEntriesCount; ++i) { + TalkEntry *talkEntry = &talkResource->_talkEntries[i]; + _vm->_dict->removeTalkEntry(talkEntry->_talkId); + } + + _vm->_talkItems->freeTalkItem(talkItem); + } void TalkResourceLoader::buildFilename(Resource *resource) { @@ -46,4 +66,80 @@ bool TalkResourceLoader::isFlag(int flag) { flag == kRlfLoadFile; } +// TalkEntry + +void TalkEntry::load(byte *dataStart, Common::SeekableReadStream &stream) { + _talkId = stream.readUint32LE(); + stream.readUint32LE(); // Skip unknown + uint32 textOffs = stream.readUint32LE(); + uint32 tblOffs = stream.readUint32LE(); + uint32 voiceNameOffs = stream.readUint32LE(); + _text = dataStart + textOffs; + _tblPtr = dataStart + tblOffs; + _voiceName = dataStart + voiceNameOffs; + + debug("TalkEntry::load() _talkId: %08X; textOffs: %08X; tblOffs: %08X; voiceNameOffs: %08X", + _talkId, textOffs, tblOffs, voiceNameOffs); +} + +// TalkResource + +TalkResource::TalkResource() + : _talkEntriesCount(0), _talkEntries(0) { +} + +TalkResource::~TalkResource() { + delete[] _talkEntries; +} + +void TalkResource::load(byte *data, uint32 dataSize) { + Common::MemoryReadStream stream(data, dataSize, DisposeAfterUse::NO); + + stream.skip(4); // Skip size + _talkEntriesCount = stream.readUint16LE(); + stream.skip(2); // Skip padding + + _talkEntries = new TalkEntry[_talkEntriesCount]; + for (uint i = 0; i < _talkEntriesCount; ++i) { + stream.seek(8 + i * 0x14); + _talkEntries[i].load(data, stream); + } + +} + +// TalkItem + +TalkItem::TalkItem(uint32 talkId, TalkResource *talkResource) + : _talkId(talkId), _talkRes(talkResource), _pauseCtr(0) { +} + +TalkItem::~TalkItem() { +} + +// TalkItems + +TalkItems::TalkItems(IllusionsEngine *vm) { +} + +TalkItems::~TalkItems() { +} + +TalkItem *TalkItems::newTalkItem(uint32 talkId, TalkResource *talkResource) { + TalkItem *talkItem = new TalkItem(talkId, talkResource); + _items.push_back(talkItem); + return talkItem; +} + +void TalkItems::freeTalkItem(TalkItem *talkItem) { + _items.remove(talkItem); + delete talkItem; +} + +TalkItem *TalkItems::findTalkItem(uint32 talkId) { + for (ItemsIterator it = _items.begin(); it != _items.end(); ++it) + if ((*it)->_talkId == talkId) + return (*it); + return 0; +} + } // End of namespace Illusions |