Common::StringArray Game::getMessage(uint32 id) { File f("*MESSAGES.DAT"); int count = f.readUint16LE(); for (int idx = 0; idx < count; ++idx) { uint32 itemId = f.readUint32LE(); uint32 offset = f.readUint32LE(); uint16 size = f.readUint16LE(); if (itemId == id) { // Get the source buffer size uint16 sizeIn; if (idx == (count - 1)) { sizeIn = f.size() - offset; } else { f.skip(4); uint32 nextOffset = f.readUint32LE(); sizeIn = nextOffset - offset; } // Get the compressed data f.seek(offset); byte *bufferIn = new byte[sizeIn]; f.read(bufferIn, sizeIn); // Decompress it char *bufferOut = new char[size]; FabDecompressor fab; fab.decompress(bufferIn, sizeIn, (byte *)bufferOut, size); // Form the output string list Common::StringArray result; const char *p = bufferOut; while (p < (bufferOut + size)) { result.push_back(p); p += strlen(p) + 1; } delete[] bufferIn; delete[] bufferOut; return result; } } error("Invalid message Id specified"); }
const char *MadsGlobals::loadMessage(uint index) { if (index > _madsMessages.size() - 1) { warning("Invalid message index: %i", index); return NULL; } FabDecompressor fab; byte *compData = new byte[_madsMessages[index].compSize]; byte *buffer = new byte[_madsMessages[index].uncompSize]; Common::SeekableReadStream *messageS = _vm->res()->get("messages.dat"); messageS->seek(_madsMessages[index].offset, SEEK_SET); messageS->read(compData, _madsMessages[index].compSize); fab.decompress(compData, _madsMessages[index].compSize, buffer, _madsMessages[index].uncompSize); for (int i = 0; i < _madsMessages[index].uncompSize - 1; i++) if (buffer[i] == '\0') buffer[i] = '\n'; _vm->res()->toss("messages.dat"); delete[] compData; return (char*)buffer; }