From 18d6c501fc8f1af50e0e945406233af7ae94a75a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 5 Oct 2016 10:47:22 +0300 Subject: CHEWY: Add support for in-game texts --- engines/chewy/text.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 5 deletions(-) (limited to 'engines/chewy/text.cpp') 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; -- cgit v1.2.3