aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic')
-rw-r--r--engines/titanic/true_talk/tt_quotes.cpp42
-rw-r--r--engines/titanic/true_talk/tt_quotes.h16
2 files changed, 45 insertions, 13 deletions
diff --git a/engines/titanic/true_talk/tt_quotes.cpp b/engines/titanic/true_talk/tt_quotes.cpp
index ced7f8e454..734ad58fbd 100644
--- a/engines/titanic/true_talk/tt_quotes.cpp
+++ b/engines/titanic/true_talk/tt_quotes.cpp
@@ -22,25 +22,50 @@
#include "common/algorithm.h"
#include "titanic/true_talk/tt_quotes.h"
+#include "titanic/titanic.h"
namespace Titanic {
TTquotes::TTquotes() {
Common::fill(&_array[0], &_array[256], 0);
_dataP = nullptr;
- _field540 = 0;
+ _dataSize = 0;
_field544 = 0;
}
TTquotes::~TTquotes() {
- for (int idx = 0; idx < 26; ++idx)
- delete _alphabet[idx]._dataP;
-
- delete _dataP;
+ delete[] _dataP;
}
void TTquotes::load(const CString &name) {
- // TODO
+ Common::SeekableReadStream *r = g_vm->_filesManager->getResource("TEXT/JRQuotes.txt");
+ size_t size = r->readUint32LE();
+
+ _dataSize = _field544 = size;
+ _dataP = new char[size + 0x10];
+
+ for (int idx = 0; idx < 256; ++idx)
+ _array[idx] = r->readUint32LE();
+
+ for (int charIdx = 0; charIdx < 26; ++charIdx) {
+ TTquotesLetter &letter = _alphabet[charIdx];
+ int count = r->readUint32LE();
+
+ // Load the list of entries for the given letter
+ letter._entries.resize(count);
+ for (int idx = 0; idx < count; ++idx) {
+ letter._entries[idx]._val1 = r->readByte();
+ letter._entries[idx]._val2 = r->readByte();
+ letter._entries[idx]._strP = _dataP + r->readUint32LE();
+ }
+ }
+
+ // Read in buffer and then decode it
+ r->read((byte *)_dataP, _dataSize);
+ for (size_t idx = 0; idx < _dataSize; idx += 4)
+ WRITE_LE_UINT32((byte *)_dataP + idx, READ_LE_UINT32((byte *)_dataP + idx) ^ 0xA55A5AA5);
+
+ delete r;
}
int TTquotes::read(const char *str) {
@@ -75,8 +100,9 @@ int TTquotes::read(const char *startP, const char *endP) {
return 0;
uint index = MIN((uint)(*startP - 'a'), (uint)25);
- TTquotesEntry &entry = _alphabet[index];
- if (!entry._dataP || entry._field4 <= 0)
+ TTquotesLetter &letter = _alphabet[index];
+ if (letter._entries.empty())
+ // No entries for the letter, so exit immediately
return 0;
// TODO
diff --git a/engines/titanic/true_talk/tt_quotes.h b/engines/titanic/true_talk/tt_quotes.h
index 2af612ca32..6649c1f744 100644
--- a/engines/titanic/true_talk/tt_quotes.h
+++ b/engines/titanic/true_talk/tt_quotes.h
@@ -24,23 +24,29 @@
#define TITANIC_TT_QUOTES_H
#include "common/scummsys.h"
+#include "common/stream.h"
#include "titanic/support/string.h"
namespace Titanic {
class TTquotes {
struct TTquotesEntry {
- byte *_dataP;
+ byte _val1, _val2;
+ const char *_strP;
+ TTquotesEntry() : _val1(0), _val2(0), _strP(nullptr) {}
+ };
+ struct TTquotesLetter {
+ Common::Array<TTquotesEntry> _entries;
int _field4;
int _field8;
- TTquotesEntry() : _dataP(nullptr), _field4(0), _field8(0) {}
+ TTquotesLetter() : _field4(0), _field8(0) {}
};
private:
- TTquotesEntry _alphabet[26];
+ TTquotesLetter _alphabet[26];
uint _array[256];
- byte *_dataP;
- int _field540;
+ const char *_dataP;
+ size_t _dataSize;
int _field544;
private:
int read(const char *startP, const char *endP);