[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