aboutsummaryrefslogtreecommitdiff
path: root/saga
diff options
context:
space:
mode:
authorEugene Sandulenko2005-01-10 22:51:01 +0000
committerEugene Sandulenko2005-01-10 22:51:01 +0000
commitdf7f9eb18299b9c68c3f5ec260ede991f5724dd9 (patch)
tree1d54271ea1782530f2b68910bd96c3a638f32d5e /saga
parentf030081647882ae537ffe6493f0b7764ce655245 (diff)
downloadscummvm-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
Diffstat (limited to 'saga')
-rw-r--r--saga/interface.cpp137
-rw-r--r--saga/interface.h34
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