diff options
author | Eugene Sandulenko | 2005-01-10 22:51:01 +0000 |
---|---|---|
committer | Eugene Sandulenko | 2005-01-10 22:51:01 +0000 |
commit | df7f9eb18299b9c68c3f5ec260ede991f5724dd9 (patch) | |
tree | 1d54271ea1782530f2b68910bd96c3a638f32d5e | |
parent | f030081647882ae537ffe6493f0b7764ce655245 (diff) | |
download | scummvm-rg350-df7f9eb18299b9c68c3f5ec260ede991f5724dd9.tar.gz scummvm-rg350-df7f9eb18299b9c68c3f5ec260ede991f5724dd9.tar.bz2 scummvm-rg350-df7f9eb18299b9c68c3f5ec260ede991f5724dd9.zip |
Untested converse. Drawing isn't possible due to lack of needed information
in ITE_interface structure.
svn-id: r16533
-rw-r--r-- | saga/interface.cpp | 137 | ||||
-rw-r--r-- | saga/interface.h | 34 |
2 files changed, 171 insertions, 0 deletions
diff --git a/saga/interface.cpp b/saga/interface.cpp index c1e52565b3..58aa52d1e9 100644 --- a/saga/interface.cpp +++ b/saga/interface.cpp @@ -791,4 +791,141 @@ int Interface::inventoryTest(const Point& imousePt, int *ibutton) { void Interface::drawVerb(int verb, int state) { } +// Converse stuff +void Interface::converseClear(void) { + for (int i = 0; i < CONVERSE_MAX_TEXTS; i++) { + if (_converseText[i].text) + free(_converseText[i].text); + _converseText[i].text = NULL; + _converseText[i].stringNum = -1; + _converseText[i].replyId = 0; + _converseText[i].replyFlags = 0; + _converseText[i].replyBit = 0; + } + + _converseTextCount = 0; + _converseStrCount = 0; + _converseStartPos = 0; + _converseEndPos = 0; + _conversePos = -1; +} + +bool Interface::converseAddText(const char *text, int replyId, byte replyFlags, int replyBit) { + int count = 0; // count how many pieces of text per string + char temp[128]; + + assert(strlen(text) < 128); + + strncpy(temp, text, 128); + + while (1) { + int i; + int len = strlen(temp); + + for (i = len; i >= 0; i--) { + byte c = temp[i]; + + if ((c == ' ' || c == '\0') + && _vm->_font->getStringWidth(SMALL_FONT_ID, temp, i, 0) + <= CONVERSE_MAX_TEXT_WIDTH) + break; + } + if (i < 0) + return true; + + if (_converseTextCount == CONVERSE_MAX_TEXTS) + return true; + + _converseText[_converseTextCount].text = (char *)malloc(i + 1); + strncpy(_converseText[_converseTextCount].text, temp, i); + + _converseText[_converseTextCount].text[i] = 0; + _converseText[_converseTextCount].textNum = count; + _converseText[_converseTextCount].stringNum = _converseStrCount; + _converseText[_converseTextCount].replyId = replyId; + _converseText[_converseTextCount].replyFlags = replyFlags; + _converseText[_converseTextCount].replyBit = replyBit; + + _converseTextCount++; + count++; + + if (len == i) + break; + + strncpy(temp, &temp[i + 1], len - i); + } + + _converseStrCount++; + + return false; +} + +enum converseColors { + kColorBrightWhite = 0x2, + kColorDarkGrey = 0xa, + kColorGrey = 0xb, + kColorGreen = 0xba, + kColorBlack = 0xf, + kColorBlue = 0x93 +}; + +void Interface::converseDisplayText(int pos) { + int end; + + if (pos >= _converseTextCount) + pos = _converseTextCount - 1; + if (pos < 0) + pos = 0; + + _converseStartPos = pos; + + end = _converseTextCount - CONVERSE_TEXT_LINES; + + if (end < 0) + end = 0; + + _converseEndPos = end; + + converseDisplayTextLine(kColorBrightWhite, false, true); +} + + +void Interface::converseSetTextLines(int row, int textcolor, bool btnDown) { + _conversePos = row + _converseStartPos; + if (_conversePos >= _converseTextCount) + _conversePos = -1; + + converseDisplayTextLine(textcolor, btnDown, false); +} + +void Interface::converseDisplayTextLine(int textcolor, bool btnDown, bool rebuild) { +} + +void Interface::converseChangePos(int chg) { + if ((chg < 0 && _converseStartPos + chg >= 0) || + (chg > 0 && _converseStartPos < _converseEndPos)) { + _converseStartPos += chg; + converseDisplayTextLine(kColorBlue, false, true); + } +} + +void Interface::converseSetPos(void) { + Converse *ct; + int selection = 1; // = keyStroke - '1'; // FIXME + + if (selection >= _converseTextCount) + return; + + // FIXME: wait until Andrew defines proper color + converseSetTextLines(selection, kColorBrightWhite, false); + + ct = &_converseText[_conversePos]; + // FIXME: TODO: finish dialog thread + + // FIXME: TODO: Puzzle + + _conversePos = -1; +} + + } // End of namespace Saga diff --git a/saga/interface.h b/saga/interface.h index b3edf44957..67a1931af5 100644 --- a/saga/interface.h +++ b/saga/interface.h @@ -101,6 +101,12 @@ enum INTERFACE_UPDATE_FLAGS { #define IHNM_INVENTORY_XSPACING 0 #define IHNM_INVENTORY_YSPACING 0 +// Converse-specific stuff +#define CONVERSE_MAX_TEXTS 64 +#define CONVERSE_MAX_TEXT_WIDTH (256 - 60) +#define CONVERSE_TEXT_HEIGHT 10 +#define CONVERSE_TEXT_LINES 4 + enum PANEL_MODES { kPanelNull, kPanelMain, @@ -201,6 +207,15 @@ struct VERB_DATA { int s_verb; }; +struct Converse { + char *text; + int stringNum; + int textNum; + int replyId; + int replyFlags; + int replyBit; +}; + class Interface { public: Interface(SagaEngine *vm); @@ -237,6 +252,18 @@ private: int handlePlayfieldClick(SURFACE *ds, const Point& imousePt); void drawVerb(int verb, int state); +public: + void converseClear(void); + bool converseAddText(const char *text, int replyId, byte replyFlags, int replyBit); + void converseDisplayText(int pos); + void converseSetTextLines(int row, int textcolor, bool btnDown); + void converseChangePos(int chg); + void converseSetPos(void); + +private: + void converseDisplayTextLine(int textcolor, bool btnUp, bool rebuild); + + private: SagaEngine *_vm; @@ -261,6 +288,13 @@ private: uint16 *_inventory; int _inventorySize; byte _inventoryCount; + + Converse _converseText[CONVERSE_MAX_TEXTS]; + int _converseTextCount; + int _converseStrCount; + int _converseStartPos; + int _converseEndPos; + int _conversePos; }; } // End of namespace Saga |