[Scummvm-git-logs] scummvm master -> 701ac40684d4413fad8763249b312dabcadd7d96

bluegr noreply at scummvm.org
Sun Mar 6 21:49:44 UTC 2022


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
701ac40684 CHEWY: Fix regression in dialogs


Commit: 701ac40684d4413fad8763249b312dabcadd7d96
    https://github.com/scummvm/scummvm/commit/701ac40684d4413fad8763249b312dabcadd7d96
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2022-03-06T23:49:20+02:00

Commit Message:
CHEWY: Fix regression in dialogs

The game loads a block of responses for each dialog, and saves the
current dialog state in saved games

Changed paths:
    engines/chewy/atds.cpp
    engines/chewy/resource.cpp
    engines/chewy/resource.h


diff --git a/engines/chewy/atds.cpp b/engines/chewy/atds.cpp
index e22fc511f83..ea3cbf5744c 100644
--- a/engines/chewy/atds.cpp
+++ b/engines/chewy/atds.cpp
@@ -30,6 +30,8 @@
 
 namespace Chewy {
 
+#define MAX_DIALOG_DATA_SIZE 6 * 3 * 6
+
 bool AtsTxtHeader::load(Common::SeekableReadStream *src) {
 	TxtNr = src->readUint16LE();
 	AMov = src->readSint16LE();
@@ -112,7 +114,7 @@ Atdsys::Atdsys() {
 	_invBlockNr = -1;
 	_invUseMem = nullptr;
 
-	_itemResource = new ItemResource(ADS_TXT_STEUER);
+	_dialogResource = new DialogResource(ADS_TXT_STEUER);
 }
 
 Atdsys::~Atdsys() {
@@ -126,7 +128,7 @@ Atdsys::~Atdsys() {
 	if (_invUseMem)
 		free(_invUseMem);
 
-	delete _itemResource;
+	delete _dialogResource;
 }
 
 void Atdsys::set_delay(int16 *delay, int16 silent) {
@@ -370,8 +372,7 @@ void Atdsys::open_handle(const char *fname, int16 mode) {
 		// Set to nullptr on purpose, this shouldn't be used
 		_atdshandle[mode] = nullptr;
 		// +3 bytes to signify the end of the stream (BLOCKENDE)
-		_atdsmem[mode] = (char *)MALLOC(_itemResource->getStreamSize() + 3);
-		_itemResource->readFromStream((byte *)_atdsmem[mode]);
+		_atdsmem[mode] = (char *)MALLOC(MAX_DIALOG_DATA_SIZE + 3);
 		_adsBlock = (AdsBlock *)_atdsmem[mode];
 		return;
 	}
@@ -427,11 +428,16 @@ void Atdsys::load_atds(int16 chunk_nr, int16 mode) {
 	char *txt_adr = _atdsmem[mode];
 
 	if (mode == ADH_DATA) {
-		uint32 streamSize = _itemResource->getStreamSize();
-		_itemResource->writeToStream((byte *)_atdsmem[ADH_HANDLE]);
-		txt_adr[streamSize] = (char)BLOCKENDE;
-		txt_adr[streamSize + 1] = (char)BLOCKENDE;
-		txt_adr[streamSize + 2] = (char)BLOCKENDE;
+		Chunk *chunk = _dialogResource->getChunk(chunk_nr);
+		uint8 *chunkData = _dialogResource->getChunkData(chunk_nr);
+
+		assert(chunk->size <= MAX_DIALOG_DATA_SIZE);
+		memcpy(_atdsmem[ADH_HANDLE], chunkData, chunk->size);
+		delete[] chunkData;
+
+		txt_adr[chunk->size] = (char)BLOCKENDE;
+		txt_adr[chunk->size + 1] = (char)BLOCKENDE;
+		txt_adr[chunk->size + 2] = (char)BLOCKENDE;
 		return;
 	}
 
@@ -461,7 +467,7 @@ void Atdsys::load_atds(int16 chunk_nr, int16 mode) {
 }
 
 void Atdsys::save_ads_header(int16 dia_nr) {
-	_itemResource->writeToStream((byte *)_atdsmem[ADH_HANDLE]);
+	_dialogResource->updateChunk(dia_nr, (byte *)_atdsmem[ADH_HANDLE]);
 }
 
 void Atdsys::crypt(char *txt, uint32 size) {
@@ -1413,14 +1419,14 @@ int16 Atdsys::getStereoPos(int16 x) {
 }
 
 void Atdsys::saveAtdsStream(Common::WriteStream *stream) {
-	_itemResource->saveStream(stream);
+	_dialogResource->saveStream(stream);
 }
 
 void Atdsys::loadAtdsStream(Common::SeekableReadStream* stream) {
-	_itemResource->loadStream(stream);
+	_dialogResource->loadStream(stream);
 }
 
 uint32 Atdsys::getAtdsStreamSize() const {
-	return _itemResource->getStreamSize();
+	return _dialogResource->getStreamSize();
 }
 } // namespace Chewy
diff --git a/engines/chewy/resource.cpp b/engines/chewy/resource.cpp
index 53351b64051..d86b66bed84 100644
--- a/engines/chewy/resource.cpp
+++ b/engines/chewy/resource.cpp
@@ -328,91 +328,90 @@ Common::SeekableReadStream *VideoResource::getVideoStream(uint num) {
 	return new Common::SeekableSubReadStream(&_stream, chunk->pos, chunk->pos + chunk->size);
 }
 
-ItemResource::ItemResource(Common::String filename) : Resource(filename) {
-	_itemBuffer = new byte[_stream.size()];
+DialogResource::DialogResource(Common::String filename) : Resource(filename) {
+	_dialogBuffer = new byte[_stream.size()];
 	_stream.seek(0, SEEK_SET);
-	_itemStream = new Common::MemorySeekableReadWriteStream(_itemBuffer, _stream.size());
-	_itemStream->writeStream(&_stream);
+	_dialogStream = new Common::MemorySeekableReadWriteStream(_dialogBuffer, _stream.size());
+	_dialogStream->writeStream(&_stream);
 }
 
-ItemResource::~ItemResource() {
-	delete _itemStream;
-	delete _itemBuffer;
+DialogResource::~DialogResource() {
+	delete _dialogStream;
+	delete _dialogBuffer;
 }
 
-ItemChunk *ItemResource::getItem(uint block) {
+DialogChunk *DialogResource::getDialog(uint block) {
 	Chunk *chunk = &_chunkList[block];
-	ItemChunk *item = new ItemChunk();
+	DialogChunk *item = new DialogChunk();
 
-	_itemStream->seek(chunk->pos, SEEK_SET);
+	_dialogStream->seek(chunk->pos, SEEK_SET);
 
-	_itemStream->read(item->show, 6);
-	_itemStream->read(item->next, 6);
-	_itemStream->read(item->flags, 6);
+	_dialogStream->read(item->show, 6);
+	_dialogStream->read(item->next, 6);
+	_dialogStream->read(item->flags, 6);
 
 	return item;
 }
 
-bool ItemResource::isItemShown(uint block, uint num) {
+bool DialogResource::isItemShown(uint block, uint num) {
 	Chunk *chunk = &_chunkList[block];
 
-	_itemStream->seek(chunk->pos, SEEK_SET);
+	_dialogStream->seek(chunk->pos, SEEK_SET);
 
-	_itemStream->skip(num);
-	return _itemStream->readByte();
+	_dialogStream->skip(num);
+	return _dialogStream->readByte();
 }
 
-void ItemResource::setItemShown(uint block, uint num, bool shown) {
+void DialogResource::setItemShown(uint block, uint num, bool shown) {
 	Chunk *chunk = &_chunkList[block];
 
-	_itemStream->seek(chunk->pos, SEEK_SET);
+	_dialogStream->seek(chunk->pos, SEEK_SET);
 
-	_itemStream->skip(num);
-	_itemStream->writeByte(shown ? 1 : 0);
+	_dialogStream->skip(num);
+	_dialogStream->writeByte(shown ? 1 : 0);
 }
 
-bool ItemResource::hasExitBit(uint block, uint num) {
-	ItemChunk *item = getItem(block);
+bool DialogResource::hasExitBit(uint block, uint num) {
+	DialogChunk *item = getDialog(block);
 	const bool isExit = (item->flags[num] & ADS_EXIT_BIT) != 0;
 	delete item;
 
 	return isExit;
 }
 
-bool ItemResource::hasRestartBit(uint block, uint num) {
-	ItemChunk *item = getItem(block);
+bool DialogResource::hasRestartBit(uint block, uint num) {
+	DialogChunk *item = getDialog(block);
 	const bool isRestart = (item->flags[num] & ADS_RESTART_BIT) != 0;
 	delete item;
 
 	return isRestart;
 }
 
-bool ItemResource::hasShowBit(uint block, uint num) {
-	ItemChunk *item = getItem(block);
+bool DialogResource::hasShowBit(uint block, uint num) {
+	DialogChunk *item = getDialog(block);
 	const bool isShown = (item->flags[num] & ADS_SHOW_BIT) != 0;
 	delete item;
 
 	return isShown;
 }
 
-void ItemResource::loadStream(Common::SeekableReadStream *s) {
-	_itemStream->seek(0, SEEK_SET);
-	_itemStream->writeStream(s, _stream.size());
+void DialogResource::loadStream(Common::SeekableReadStream *s) {
+	_dialogStream->seek(0, SEEK_SET);
+	_dialogStream->writeStream(s, _stream.size());
 }
 
-void ItemResource::saveStream(Common::WriteStream* s) {
-	_itemStream->seek(0, SEEK_SET);
-	s->writeStream(_itemStream, _stream.size());
+void DialogResource::saveStream(Common::WriteStream* s) {
+	_dialogStream->seek(0, SEEK_SET);
+	s->writeStream(_dialogStream, _stream.size());
 }
 
-void ItemResource::readFromStream(byte *data) {
-	_itemStream->seek(0, SEEK_SET);
-	_itemStream->read(data, _stream.size());
-}
+void DialogResource::updateChunk(uint num, byte *data) {
+	assert(num < _chunkList.size());
 
-void ItemResource::writeToStream(byte *data) {
-	_itemStream->seek(0, SEEK_SET);
-	_itemStream->write(data, _stream.size());
+	Chunk *chunk = &_chunkList[num];
+
+	_stream.seek(chunk->pos, SEEK_SET);
+	_dialogStream->write(data, chunk->size);
 }
 
 }
diff --git a/engines/chewy/resource.h b/engines/chewy/resource.h
index 85648e49d03..e6e64660cb1 100644
--- a/engines/chewy/resource.h
+++ b/engines/chewy/resource.h
@@ -114,10 +114,10 @@ struct VideoChunk {
 	uint32 firstFrameOffset;
 };
 
-// Item chunk header (AdsBlock)
+// Dialog chunk header (AdsBlock)
 // Original values are in diah.adh, and are synced
 // to saved games
-struct ItemChunk {
+struct DialogChunk {
 	bool show[6];
 	uint8 next[6];
 	uint8 flags[6];
@@ -203,12 +203,12 @@ public:
 	Common::SeekableReadStream *getVideoStream(uint num);
 };
 
-class ItemResource : public Resource {
+class DialogResource : public Resource {
 public:
-	ItemResource(Common::String filename);
-	virtual ~ItemResource();
+	DialogResource(Common::String filename);
+	virtual ~DialogResource();
 
-	ItemChunk *getItem(uint block);
+	DialogChunk *getDialog(uint block);
 	bool isItemShown(uint block, uint num);
 	void setItemShown(uint block, uint num, bool shown);
 	bool hasExitBit(uint block, uint num);
@@ -222,14 +222,13 @@ public:
 		return _stream.size();
 	}
 
-	// HACK: The following functions allow direct access
+	// HACK: The following function allows direct access
 	// to the stream, and should be removed
-	void readFromStream(byte *data);
-	void writeToStream(byte *data);
+	void updateChunk(uint num, byte *data);
 
 private:
-	Common::MemorySeekableReadWriteStream *_itemStream;
-	byte *_itemBuffer;
+	Common::MemorySeekableReadWriteStream *_dialogStream;
+	byte *_dialogBuffer;
 };
 
 } // namespace Chewy




More information about the Scummvm-git-logs mailing list