aboutsummaryrefslogtreecommitdiff
path: root/engines/chewy/resource.cpp
diff options
context:
space:
mode:
authorFilippos Karapetis2016-10-03 05:29:58 +0300
committerFilippos Karapetis2016-10-03 05:29:58 +0300
commitcec2799c64d996dba247669c6eedfbffacc5f384 (patch)
treeeab233341f4f917a812301629f8d91fc6ecf855e /engines/chewy/resource.cpp
parent9e5b745a123f0cc9b696eed6946edc31ef702dd8 (diff)
downloadscummvm-rg350-cec2799c64d996dba247669c6eedfbffacc5f384.tar.gz
scummvm-rg350-cec2799c64d996dba247669c6eedfbffacc5f384.tar.bz2
scummvm-rg350-cec2799c64d996dba247669c6eedfbffacc5f384.zip
CHEWY: Properly handle the text encryption in atds.tap (game texts)
Diffstat (limited to 'engines/chewy/resource.cpp')
-rw-r--r--engines/chewy/resource.cpp31
1 files changed, 19 insertions, 12 deletions
diff --git a/engines/chewy/resource.cpp b/engines/chewy/resource.cpp
index 90849cd555..352e2f11d7 100644
--- a/engines/chewy/resource.cpp
+++ b/engines/chewy/resource.cpp
@@ -41,9 +41,9 @@ namespace Chewy {
// misc/inventar.iib
// misc/inventar.sib
// room/test.rdi
-// txt/*.tap
+// txt/atds.tap (game texts)
// txt/diah.adh
-// txt/inv_st.s and txt/room_st.s
+// txt/inv_st.s and txt/room_st.s (inventory/room control bytes)
// txt/inv_use.idx
Resource::Resource(Common::String filename) {
@@ -52,6 +52,7 @@ Resource::Resource(Common::String filename) {
const uint32 headerTxtEnc = MKTAG('T', 'C', 'F', '\1');
const uint32 headerSprite = MKTAG('T', 'A', 'F', '\0');
+ filename.toLowercase();
_stream.open(filename);
uint32 header = _stream.readUint32BE();
@@ -72,6 +73,9 @@ Resource::Resource(Common::String filename) {
_encrypted = false;
}
+ if (filename == "atds.tap")
+ _encrypted = true;
+
_chunkCount = _stream.readUint16LE();
for (uint i = 0; i < _chunkCount; i++) {
@@ -113,6 +117,8 @@ byte *Resource::getChunkData(uint num) {
_stream.seek(chunk->pos, SEEK_SET);
_stream.read(data, chunk->size);
+ if (_encrypted)
+ decrypt(data, chunk->size);
return data;
}
@@ -170,6 +176,15 @@ void Resource::unpackRLE(byte *buffer, uint32 compressedSize, uint32 uncompresse
}
}
+void Resource::decrypt(byte *data, uint32 size) {
+ byte *c = data;
+
+ for (uint i = 0; i < size; i++) {
+ *c = -(*c);
+ ++c;
+ }
+}
+
TAFChunk *SpriteResource::getSprite(uint num) {
assert(num < _chunkList.size());
@@ -276,17 +291,9 @@ Common::String ErrorMessage::getErrorMessage(uint num) {
byte *data = new byte[chunk->size];
_stream.seek(chunk->pos, SEEK_SET);
-
_stream.read(data, chunk->size);
-
- if (_encrypted) {
- byte *c = data;
-
- for (uint i = 0; i < chunk->size; i++) {
- *c = -(*c);
- ++c;
- }
- }
+ if (_encrypted)
+ decrypt(data, chunk->size);
str = (char *)data;
delete[] data;