aboutsummaryrefslogtreecommitdiff
path: root/engines/chewy/text.cpp
diff options
context:
space:
mode:
authorFilippos Karapetis2016-10-05 10:47:22 +0300
committerFilippos Karapetis2016-10-05 10:47:22 +0300
commit18d6c501fc8f1af50e0e945406233af7ae94a75a (patch)
treeec6cf3b5b5c5c6c77ee48c9ed9487937f8743a6a /engines/chewy/text.cpp
parent19dab45c8c8bbca6aedce0574ffa44ab27715172 (diff)
downloadscummvm-rg350-18d6c501fc8f1af50e0e945406233af7ae94a75a.tar.gz
scummvm-rg350-18d6c501fc8f1af50e0e945406233af7ae94a75a.tar.bz2
scummvm-rg350-18d6c501fc8f1af50e0e945406233af7ae94a75a.zip
CHEWY: Add support for in-game texts
Diffstat (limited to 'engines/chewy/text.cpp')
-rw-r--r--engines/chewy/text.cpp63
1 files changed, 58 insertions, 5 deletions
diff --git a/engines/chewy/text.cpp b/engines/chewy/text.cpp
index da7b2279f4..e877b99f83 100644
--- a/engines/chewy/text.cpp
+++ b/engines/chewy/text.cpp
@@ -34,11 +34,11 @@ Text::Text() : Resource("atds.tap") {
Text::~Text() {
}
-DialogList *Text::getDialog(uint dialogNum, uint entryNum) {
- DialogList *l = new DialogList();
-
+TextEntryList *Text::getDialog(uint dialogNum, uint entryNum) {
if (dialogNum >= kADSTextMax)
- error("getDialog(): Invalid entry number requested, %d (max %d)", dialogNum, kADSTextMax);
+ error("getDialog(): Invalid entry number requested, %d (max %d)", dialogNum, kADSTextMax - 1);
+
+ TextEntryList *l = new TextEntryList();
byte *data = getChunkData(dialogNum);
byte *ptr = data;
@@ -51,7 +51,7 @@ DialogList *Text::getDialog(uint dialogNum, uint entryNum) {
for (uint i = 0; i <= entryNum; i++) {
do {
- Dialog curDialog;
+ TextEntry curDialog;
ptr++; // current entry
ptr += 2;
curDialog.speechId = READ_LE_UINT16(ptr) - VOICE_OFFSET; ptr += 2;
@@ -81,6 +81,59 @@ DialogList *Text::getDialog(uint dialogNum, uint entryNum) {
return l;
}
+TextEntry *Text::getText(uint dialogNum, uint entryNum) {
+ if (dialogNum < kADSTextMax)
+ error("getText(): Invalid entry number requested, %d (min %d)", dialogNum, kADSTextMax);
+
+ TextEntry *d = new TextEntry();
+ bool isText = (dialogNum >= kADSTextMax && dialogNum < kADSTextMax + kATSTextMax);
+ bool isAutoDialog = (dialogNum >= kADSTextMax + kATSTextMax && dialogNum < kADSTextMax + kATSTextMax + kAADTextMax);
+ //bool isInvText = (dialogNum >= kADSTextMax + kATSTextMax + kAADTextMax && dialogNum < kADSTextMax + kATSTextMax + kAADTextMax + kINVTextMax);
+
+ byte *data = getChunkData(dialogNum);
+ byte *ptr = data;
+
+ if (isAutoDialog)
+ ptr += 3;
+
+ for (uint i = 0; i <= entryNum; i++) {
+ ptr += 13;
+ d->speechId = READ_LE_UINT16(ptr) - VOICE_OFFSET; ptr += 2;
+
+ do {
+ if (i == entryNum)
+ d->text += *ptr++;
+ else
+ ptr++;
+
+ if (*ptr == 0 && *(ptr + 1) != kEndText) {
+ // TODO: Split lines
+ *ptr = ' ';
+ }
+ } while (*ptr);
+
+ if (*(ptr + 1) != kEndText || *(ptr + 2) != kEndChunk)
+ error("Invalid text resource - %d", dialogNum);
+
+ if (!isText)
+ ptr += 3; // 0, kEndText, kEndChunk
+ if (isAutoDialog)
+ ptr += 3;
+
+ if (i == entryNum) {
+ // Found
+ delete[] data;
+ return d;
+ }
+ }
+
+ // Not found
+ delete[] data;
+ delete d;
+
+ return nullptr;
+}
+
Font::Font(Common::String filename) {
const uint32 headerFont = MKTAG('T', 'F', 'F', '\0');
Common::File stream;