diff options
author | David Eriksson | 2003-10-07 12:20:31 +0000 |
---|---|---|
committer | David Eriksson | 2003-10-07 12:20:31 +0000 |
commit | f99c8b81dbbdcab69ea40aa8acbf8db9198cbf2d (patch) | |
tree | 9005e53b86bd9fc3813d5e2f8e8207646cd428c7 | |
parent | 577fe4c5fb97d0d29669b67fbf49abd09a31dded (diff) | |
download | scummvm-rg350-f99c8b81dbbdcab69ea40aa8acbf8db9198cbf2d.tar.gz scummvm-rg350-f99c8b81dbbdcab69ea40aa8acbf8db9198cbf2d.tar.bz2 scummvm-rg350-f99c8b81dbbdcab69ea40aa8acbf8db9198cbf2d.zip |
Improved Queen::Talk class
svn-id: r10667
-rw-r--r-- | queen/cutaway.cpp | 2 | ||||
-rw-r--r-- | queen/talk.cpp | 156 | ||||
-rw-r--r-- | queen/talk.h | 20 |
3 files changed, 162 insertions, 16 deletions
diff --git a/queen/cutaway.cpp b/queen/cutaway.cpp index 275d18ba46..e8190817bc 100644 --- a/queen/cutaway.cpp +++ b/queen/cutaway.cpp @@ -1014,7 +1014,7 @@ void Cutaway::talk(char *nextFilename) { warning("Cutaway::talk() used but not fully implemented"); nextFilename[0] = '\0'; - Talk::run(_talkFile, nextFilename, _logic, _resource); + Talk::run(_talkFile, nextFilename, _graphics, _logic, _resource); } } diff --git a/queen/talk.cpp b/queen/talk.cpp index a3b4d87635..f15efa9238 100644 --- a/queen/talk.cpp +++ b/queen/talk.cpp @@ -35,17 +35,19 @@ namespace Queen { void Talk::run( const char *filename, char *cutawayFilename, + Graphics *graphics, Logic *logic, Resource *resource) { - Talk *talk = new Talk(logic, resource); + Talk *talk = new Talk(graphics, logic, resource); talk->talk(filename, cutawayFilename); delete talk; } Talk::Talk( + Graphics *graphics, Logic *logic, Resource *resource) -: _logic(logic), _resource(resource), _fileData(NULL), _quit(false) { +: _graphics(graphics), _logic(logic), _resource(resource), _fileData(NULL), _quit(false) { //! TODO Move this to the Logic class later! memset(_talkSelected, 0, sizeof(_talkSelected)); @@ -102,7 +104,7 @@ void Talk::talk(const char *filename, char *cutawayFilename) { // TODO: split this loop in several functions while(retval != -1) { - debug(0, "retval = %i", retval); + // debug(0, "retval = %i", retval); char otherVoiceFilePrefix [MAX_STRING_SIZE]; char joeVoiceFilePrefix [5][MAX_STRING_SIZE]; @@ -151,7 +153,7 @@ void Talk::talk(const char *filename, char *cutawayFilename) { } } - debug(0, "choicesLeft = %i", choicesLeft); + // debug(0, "choicesLeft = %i", choicesLeft); if (1 == choicesLeft) { // Automatically run the final dialogue option @@ -429,21 +431,155 @@ Talk::TalkSelected *Talk::talkSelected() { return _talkSelected + _uniqueKey; } +int Talk::splitOption(const char *str, char optionText[5][MAX_STRING_SIZE]) { + + //debug(0, "splitOption(\"%s\")", str); + + // Check to see if option fits on one line, and exit early + + /* XXX if (_logic->language() == ENGLISH || textWidth(str) <= MAX_TEXT_WIDTH)*/ { + strcpy(optionText[0], str); + return 1; + } + + abort(); + + // Split up multiple line option at closest space character + // int optionLines = 0; +} + +static char *removeStar(char *str) { + + // The remove_star function in talk.c uses a static variable, but this + // modifies the string instead, so the caller should use a copy of the + // string. + + char *p = strchr(str, '*'); + if (p) + *p = '\0'; + + return str; +} + +static void text(int x, int y, const char *str) { + + // This function is just for debugging, the caller should really use some + // method in Queen::Graphics. + + debug(0, "Write '%s' at (%i,%i)", str, x, y); +} + int16 Talk::selectSentence() { + // Function TALK_BOB (lines 577-739) in talk.c int selectedSentence = 0; - debug(0, "----- Select a sentence of these -----"); + int scrollX = 0; // XXX: global variable + int startOption = 1; + int optionLines = 0; + char optionText[5][MAX_STRING_SIZE]; + + // These bobs are up and down arrows + + BobSlot *bob1 = _graphics->bob(SENTENCE_BOB_1); + BobSlot *bob2 = _graphics->bob(SENTENCE_BOB_2); + + bob1->x = 303 + 8 + scrollX; + bob1->y = 150 + 1; + bob1->frameNum = 3; + bob1->box.y2 = 199; + bob1->active = false; + + bob2->x = 303 + scrollX; + bob2->y = 175; + bob2->frameNum = 4; + bob2->box.y2 = 199; + bob2->active = false; + + bool rezone = true; + + while (rezone) { + rezone = false; + + // Set zones for UP/DOWN text arrows when not English version + // XXX ClearZones(1); + + if (_logic->language() != ENGLISH) { + // XXX SetZone(1,5,MAXTEXTLEN+1, 0,319,24); + // XXX SetZone(1,6,MAXTEXTLEN+1,25,319,49); + } + + // blanktexts(151,199); + int sentenceCount = 0; + int yOffset = 1; + + for (int i = startOption; i <= 4; i++) { + // XXX TALK_ZONE[I] = 0; + if (_talkString[i][0] != '\0') { + sentenceCount++; + + char temp[MAX_STRING_SIZE]; + strcpy(temp, _talkString[i]); + optionLines = splitOption(removeStar(temp), optionText); + + if (yOffset < 5) + /* XXX SetZone( + 1, + I, + 0, + (yofs * 10) - PUSHUP, + (VersionStr[1] =='E') ? 319 : MAX_TEXT_WIDTH, + 10 * optionLines + (yOffset * 10) - PUSHUP) */; + + for (int j = 0; j < optionLines; j++) { + if (yOffset < 5) + text((j == 0) ? 0 : 24, 150 - PUSHUP + yOffset * 10, optionText[j]); + yOffset++; + } + + // XXX TALK_ZONE[i] = sentenceCount; + } + } + + yOffset--; + + // Up and down dialogue arrows + + if (_logic->language() != ENGLISH) { + bob1->active = (startOption > 1); + bob2->active = (yOffset > 4); + } + + // XXX KEYVERB=0; + if (sentenceCount > 0) { + // XXX CH=0, S=0, OLDS=0; + // XXX while(CH==0) + + if (_quit) + break; + + // XXX update(); + + // XXX manage input + } + } + + + // XXX Begin debug stuff + // debug(0, "----- Select a sentence of these -----"); for (int i = 1; i <= 4; i++) { if (_talkString[i][0] != '\0') { - debug(0, "%i: %s", i, _talkString[i]); - if (!selectedSentence) // XXX debug - selectedSentence = i; // XXX debug + // XXX debug(0, "%i: %s", i, _talkString[i]); + if (!selectedSentence) + selectedSentence = i; } } - + // XXX End debug stuff + + bob1->active = false; + bob2->active = false; + debug(0, "Selected sentence %i", selectedSentence); - return selectedSentence; } diff --git a/queen/talk.h b/queen/talk.h index dfeea6b128..dde6528737 100644 --- a/queen/talk.h +++ b/queen/talk.h @@ -26,8 +26,9 @@ namespace Queen { -class Resource; +class Graphics; class Logic; +class Resource; class Talk { public: @@ -36,6 +37,7 @@ class Talk { static void run( const char *filename, char *cutawayFilename, + Graphics *graphics, Logic *logic, Resource *resource); @@ -57,7 +59,11 @@ class Talk { enum { MAX_STRING_LENGTH = 255, MAX_STRING_SIZE = (MAX_STRING_LENGTH + 1), - TALK_SELECTED_COUNT = 86 + MAX_TEXT_WIDTH = (320-18), + PUSHUP = 4, + TALK_SELECTED_COUNT = 86, + SENTENCE_BOB_1 = 62, + SENTENCE_BOB_2 = 63 }; //! TODO Move this to struct.h later! @@ -73,8 +79,9 @@ class Talk { int16 gameStateValue; }; - Logic *_logic; - Resource *_resource; + Graphics *_graphics; + Logic *_logic; + Resource *_resource; //! Raw .dog file data (without 20 byte header) byte *_fileData; @@ -117,7 +124,7 @@ class Talk { char _talkString[5][MAX_STRING_SIZE]; - Talk(Logic *logic, Resource *resource); + Talk(Graphics *graphics, Logic *logic, Resource *resource); ~Talk(); //! Perform talk in file and return a cutaway filename @@ -144,6 +151,9 @@ class Talk { //! Select what to say int16 selectSentence(); + static int splitOption(const char *str, char optionText[5][MAX_STRING_SIZE]); + + }; } // End of namespace Queen |