diff --git a/scumm/actor.cpp b/scumm/actor.cpp index 6523f679160..e2cb63d552e 100644 --- a/scumm/actor.cpp +++ b/scumm/actor.cpp @@ -1144,10 +1144,10 @@ int ScummEngine::getActorFromPos(int x, int y) { return 0; } -void ScummEngine::actorTalk() { +void ScummEngine::actorTalk(const byte *msg) { Actor *a; - _messagePtr = addMessageToStack(_messagePtr, _charsetBuffer, sizeof(_charsetBuffer)); + _messagePtr = addMessageToStack(msg, _charsetBuffer, sizeof(_charsetBuffer)); // FIXME: Workaround for bugs #770039 and #770049 if (_gameId == GID_LOOM || _gameId == GID_LOOM256) { diff --git a/scumm/script_v2.cpp b/scumm/script_v2.cpp index 5eae8ebc773..28a73a0b165 100644 --- a/scumm/script_v2.cpp +++ b/scumm/script_v2.cpp @@ -428,8 +428,7 @@ void ScummEngine_v2::decodeParseString() { _string[textSlot].color = v1_mm_actor_speech_color[_actorToPrintStrFor]; } - _messagePtr = buffer; - actorTalk(); + actorTalk(buffer); } int ScummEngine_v2::readVar(uint var) { @@ -1055,15 +1054,13 @@ void ScummEngine_v2::o2_drawSentence() { ptr++; } - _messagePtr = (byte*)sentence; - sentenceline.top = virtscr[2].topline; sentenceline.bottom = virtscr[2].topline + 8; sentenceline.left = 0; sentenceline.right = 319; restoreBG(sentenceline); - drawString(2); + drawString(2, (byte*)sentence); } void ScummEngine_v2::o2_ifClassOfIs() { diff --git a/scumm/script_v5.cpp b/scumm/script_v5.cpp index cb57dd94782..2f294568c2b 100644 --- a/scumm/script_v5.cpp +++ b/scumm/script_v5.cpp @@ -2702,6 +2702,7 @@ int ScummEngine_v5::getWordVararg(int *ptr) { void ScummEngine_v5::decodeParseString() { int textSlot; + const byte *msg; switch (_actorToPrintStrFor) { case 252: @@ -2784,19 +2785,21 @@ void ScummEngine_v5::decodeParseString() { } break; case 15: // SO_TEXTSTRING - _messagePtr = _scriptPointer; + msg = _scriptPointer; + _scriptPointer += resStrLen(_scriptPointer)+ 1; + switch (textSlot) { case 0: - actorTalk(); + actorTalk(msg); break; case 1: - drawString(1); + drawString(1, msg); break; case 2: - unkMessage1(); + unkMessage1(msg); break; case 3: - unkMessage2(); + unkMessage2(msg); break; } @@ -2812,8 +2815,6 @@ void ScummEngine_v5::decodeParseString() { _string[textSlot].t_ypos = _string[textSlot].ypos; _string[textSlot].t_color = _string[textSlot].color; } - - _scriptPointer = _messagePtr; return; default: warning("ScummEngine_v5::decodeParseString: Unhandled case %d", _opcode & 0xF); diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp index 42f00c92c52..4dc25063fc1 100644 --- a/scumm/script_v6.cpp +++ b/scumm/script_v6.cpp @@ -2319,11 +2319,11 @@ void ScummEngine_v6::o6_printEgo() { void ScummEngine_v6::o6_talkActor() { _actorToPrintStrFor = pop(); - _messagePtr = translateTextAndPlaySpeech(_scriptPointer); + const byte *msg = translateTextAndPlaySpeech(_scriptPointer); _scriptPointer += resStrLen(_scriptPointer) + 1; setStringVars(0); - actorTalk(); + actorTalk(msg); } void ScummEngine_v6::o6_talkEgo() { @@ -2507,9 +2507,8 @@ void ScummEngine_v6::o6_kernelSetFunctions() { case 17:{ const byte *message; byte buf_input[300], buf_output[300]; - _messagePtr = getStringAddressVar(VAR_STRING2DRAW); message = buf_input; - addMessageToStack(_messagePtr, buf_input, sizeof(buf_input)); + addMessageToStack(getStringAddressVar(VAR_STRING2DRAW), buf_input, sizeof(buf_input)); if ((_gameId == GID_DIG) && !(_features & GF_DEMO)) { byte buf_trans[300]; char *t_ptr = (char *)buf_input; @@ -3115,6 +3114,7 @@ void ScummEngine_v6::o6_setBoxSet() { void ScummEngine_v6::decodeParseString(int m, int n) { byte b; + const byte *msg; b = fetchScriptByte(); @@ -3149,29 +3149,30 @@ void ScummEngine_v6::decodeParseString(int m, int n) { _string[m].no_talk_anim = true; break; case 75: // SO_TEXTSTRING - _messagePtr = translateTextAndPlaySpeech(_scriptPointer); - _scriptPointer += resStrLen(_scriptPointer)+ 1; + msg = translateTextAndPlaySpeech(_scriptPointer); + _scriptPointer += resStrLen(_scriptPointer) + 1; switch (m) { case 0: - actorTalk(); + actorTalk(msg); break; case 1: - drawString(1); + drawString(1, msg); break; case 2: - unkMessage1(); + unkMessage1(msg); break; case 3: - unkMessage2(); + unkMessage2(msg); break; } - return; + + break; case 0xFE: setStringVars(m); if (n) _actorToPrintStrFor = pop(); - return; + break; case 0xFF: _string[m].t_xpos = _string[m].xpos; _string[m].t_ypos = _string[m].ypos; @@ -3181,7 +3182,7 @@ void ScummEngine_v6::decodeParseString(int m, int n) { _string[m].t_right = _string[m].right; _string[m].t_color = _string[m].color; _string[m].t_charset = _string[m].charset; - return; + break; default: error("decodeParseString: default case 0x%x", b); } diff --git a/scumm/script_v6he.cpp b/scumm/script_v6he.cpp index e006b057210..377f8834ef5 100644 --- a/scumm/script_v6he.cpp +++ b/scumm/script_v6he.cpp @@ -955,8 +955,7 @@ void ScummEngine_v6he::o6_openFile() { int mode, len, slot, l, r; byte filename[100]; - _messagePtr = _scriptPointer; - addMessageToStack(_messagePtr, filename, sizeof(filename)); + addMessageToStack(_scriptPointer, filename, sizeof(filename)); len = resStrLen(_scriptPointer); _scriptPointer += len + 1; @@ -1002,8 +1001,7 @@ void ScummEngine_v6he::o6_deleteFile() { int len, r; byte filename[100]; - _messagePtr = _scriptPointer; - addMessageToStack(_messagePtr, filename, sizeof(filename)); + addMessageToStack(_scriptPointer, filename, sizeof(filename)); len = resStrLen(_scriptPointer); _scriptPointer += len + 1; @@ -1020,8 +1018,7 @@ void ScummEngine_v6he::o6_rename() { int len, r1, r2; byte filename[100],filename2[100]; - _messagePtr = _scriptPointer; - addMessageToStack(_messagePtr, filename, sizeof(filename)); + addMessageToStack(_scriptPointer, filename, sizeof(filename)); len = resStrLen(_scriptPointer); _scriptPointer += len + 1; @@ -1031,8 +1028,7 @@ void ScummEngine_v6he::o6_rename() { break; } - _messagePtr = _scriptPointer; - addMessageToStack(_messagePtr, filename2, sizeof(filename2)); + addMessageToStack(_scriptPointer, filename2, sizeof(filename2)); len = resStrLen(_scriptPointer); _scriptPointer += len + 1; @@ -1340,22 +1336,19 @@ void ScummEngine_v6he::o6_unknownF4() { switch (b) { case 1: - _messagePtr = _scriptPointer; - addMessageToStack(_messagePtr, filename1, sizeof(filename1)); + addMessageToStack(_scriptPointer, filename1, sizeof(filename1)); len = resStrLen(_scriptPointer); _scriptPointer += len + 1; - debug(1, "o6_unknownF4(%d, %d, \"%s\")", a, b, _messagePtr); + debug(1, "o6_unknownF4(%d, %d, \"%s\")", a, b, filename1); break; case 2: - _messagePtr = _scriptPointer; - addMessageToStack(_messagePtr, filename1, sizeof(filename1)); + addMessageToStack(_scriptPointer, filename1, sizeof(filename1)); len = resStrLen(_scriptPointer); _scriptPointer += len + 1; - _messagePtr = _scriptPointer; - addMessageToStack(_messagePtr, filename2, sizeof(filename2)); + addMessageToStack(_scriptPointer, filename2, sizeof(filename2)); len = resStrLen(_scriptPointer); _scriptPointer += len + 1; @@ -1371,8 +1364,7 @@ void ScummEngine_v6he::o6_unknownF9() { int len, r; byte filename[100]; - _messagePtr = _scriptPointer; - addMessageToStack(_messagePtr, filename, sizeof(filename)); + addMessageToStack(_scriptPointer, filename, sizeof(filename)); len = resStrLen(_scriptPointer); _scriptPointer += len + 1; @@ -1413,6 +1405,7 @@ void ScummEngine_v6he::o6_unknownFB() { void ScummEngine_v6he::decodeParseString(int m, int n) { byte b; int c; + const byte *msg; b = fetchScriptByte(); @@ -1447,24 +1440,25 @@ void ScummEngine_v6he::decodeParseString(int m, int n) { _string[m].no_talk_anim = true; break; case 75: // SO_TEXTSTRING - _messagePtr = translateTextAndPlaySpeech(_scriptPointer); - _scriptPointer += resStrLen(_scriptPointer)+ 1; + msg = translateTextAndPlaySpeech(_scriptPointer); + _scriptPointer += resStrLen(_scriptPointer) + 1; switch (m) { case 0: - actorTalk(); + actorTalk(msg); break; case 1: - drawString(1); + drawString(1, msg); break; case 2: - unkMessage1(); + unkMessage1(msg); break; case 3: - unkMessage2(); + unkMessage2(msg); break; } - return; + + break; case 0xF9: c = pop(); if (c == 1) { @@ -1475,12 +1469,12 @@ void ScummEngine_v6he::decodeParseString(int m, int n) { getStackList(args, ARRAYSIZE(args)); } warning("decodeParseString case 0xF9 stub"); - return; + break; case 0xFE: setStringVars(m); if (n) _actorToPrintStrFor = pop(); - return; + break; case 0xFF: _string[m].t_xpos = _string[m].xpos; _string[m].t_ypos = _string[m].ypos; @@ -1490,7 +1484,7 @@ void ScummEngine_v6he::decodeParseString(int m, int n) { _string[m].t_right = _string[m].right; _string[m].t_color = _string[m].color; _string[m].t_charset = _string[m].charset; - return; + break; default: error("decodeParseString: default case 0x%x", b); } diff --git a/scumm/script_v8.cpp b/scumm/script_v8.cpp index 29d49a02138..dde8b6b269d 100644 --- a/scumm/script_v8.cpp +++ b/scumm/script_v8.cpp @@ -467,6 +467,7 @@ void ScummEngine_v8::writeVar(uint var, int value) { void ScummEngine_v8::decodeParseString(int m, int n) { byte b; + const byte *msg; b = fetchScriptByte(); @@ -513,29 +514,30 @@ void ScummEngine_v8::decodeParseString(int m, int n) { _string[m].no_talk_anim = true; break; case 0xD1: // SO_PRINT_STRING - _messagePtr = translateTextAndPlaySpeech(_scriptPointer); - _scriptPointer += resStrLen(_scriptPointer)+ 1; + msg = translateTextAndPlaySpeech(_scriptPointer); + _scriptPointer += resStrLen(_scriptPointer) + 1; switch (m) { case 0: - actorTalk(); + actorTalk(msg); break; case 1: - drawString(1); + drawString(1, msg); break; case 2: - unkMessage1(); + unkMessage1(msg); break; case 3: - unkMessage2(); + unkMessage2(msg); break; case 5:{ byte buffer[256]; - addMessageToStack(_messagePtr, buffer, sizeof(buffer)); + addMessageToStack(msg, buffer, sizeof(buffer)); enqueueText(buffer, _string[m].xpos, _string[m].ypos, _string[m].color, _string[m].charset, _string[m].center); } break; } + break; case 0xD2: // SO_PRINT_WRAP Set print wordwrap //warning("decodeParseString: SO_PRINT_WRAP"); diff --git a/scumm/scumm.h b/scumm/scumm.h index 6a6facc48fa..aeee376cbee 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -775,7 +775,7 @@ public: SentenceTab _sentence[NUM_SENTENCE]; StringTab _string[6]; int16 _talkDelay; - void actorTalk(); + void actorTalk(const byte *msg); void stopTalk(); int talkingActor(); // Wrapper around VAR_TALK_ACTOR for V1 Maniac void talkingActor(int variable); @@ -1063,14 +1063,14 @@ protected: void initCharset(int charset); void CHARSET_1(); - void drawString(int a); + void drawString(int a, const byte *msg); const byte *addMessageToStack(const byte *msg, byte *dstBuffer, int dstBufferSize); void addIntToStack(int var); void addVerbToStack(int var); void addNameToStack(int var); void addStringToStack(int var); - void unkMessage1(); - void unkMessage2(); + void unkMessage1(const byte *msg); + void unkMessage2(const byte *msg); public: void clearMsgQueue(); // Used by Actor::putActor protected: diff --git a/scumm/string.cpp b/scumm/string.cpp index 16115a43fec..a184ca8abfd 100644 --- a/scumm/string.cpp +++ b/scumm/string.cpp @@ -46,9 +46,9 @@ void ScummEngine::setStringVars(int slot) { st->charset = st->t_charset; } -void ScummEngine::unkMessage1() { +void ScummEngine::unkMessage1(const byte *msg) { byte buffer[100]; - _messagePtr = addMessageToStack(_messagePtr, buffer, sizeof(buffer)); + _messagePtr = addMessageToStack(msg, buffer, sizeof(buffer)); // if ((_gameId == GID_CMI) && _debugMode) { // In CMI, unkMessage1 is used for printDebug output if ((buffer[0] != 0xFF) && _debugMode) { @@ -71,13 +71,13 @@ void ScummEngine::unkMessage1() { } } -void ScummEngine::unkMessage2() { +void ScummEngine::unkMessage2(const byte *msg) { // Original COMI used different code at this point. // Seemed to use blastText for the messages byte buf[100]; const byte *tmp; - tmp = _messagePtr = addMessageToStack(_messagePtr, buf, sizeof(buf)); + tmp = _messagePtr = addMessageToStack(msg, buf, sizeof(buf)); if (_string[3].color == 0) _string[3].color = 4; @@ -339,14 +339,14 @@ void ScummEngine::CHARSET_1() { _charset->_mask = _charset->_str; } -void ScummEngine::drawString(int a) { +void ScummEngine::drawString(int a, const byte *msg) { byte buf[256]; byte *space; int i, c; byte fontHeight = 0; uint color; - _messagePtr = addMessageToStack(_messagePtr, buf, sizeof(buf)); + _messagePtr = addMessageToStack(msg, buf, sizeof(buf)); _charset->_top = _string[a].ypos + _screenTop; _charset->_startLeft = _charset->_left = _string[a].xpos; diff --git a/scumm/verbs.cpp b/scumm/verbs.cpp index b5e1b235c9d..98af117a6bc 100644 --- a/scumm/verbs.cpp +++ b/scumm/verbs.cpp @@ -228,18 +228,18 @@ void ScummEngine::redrawV2Inventory() { _string[1].xpos = v2_mouseover_boxes[i].rect.left; _string[1].color = v2_mouseover_boxes[i].color; - _messagePtr = getObjOrActorName(obj); - assert(_messagePtr); + + const byte *tmp = getObjOrActorName(obj); + assert(tmp); // Prevent inventory entries from overflowing by truncating the text // after 144/8 = 18 chars byte msg[18 + 1]; msg[18] = 0; - strncpy((char *)msg, (const char *)_messagePtr, 18); - _messagePtr = msg; + strncpy((char *)msg, (const char *)tmp, 18); // Draw it - drawString(1); + drawString(1, msg); } @@ -248,8 +248,7 @@ void ScummEngine::redrawV2Inventory() { _string[1].xpos = v2_mouseover_boxes[kInventoryUpArrow].rect.left; _string[1].ypos = v2_mouseover_boxes[kInventoryUpArrow].rect.top + vs->topline; _string[1].color = v2_mouseover_boxes[kInventoryUpArrow].color; - _messagePtr = (const byte *)" \1\2"; - drawString(1); + drawString(1, (const byte *)" \1\2"); } // If necessary, draw "down" arrow @@ -257,8 +256,7 @@ void ScummEngine::redrawV2Inventory() { _string[1].xpos = v2_mouseover_boxes[kInventoryDownArrow].rect.left; _string[1].ypos = v2_mouseover_boxes[kInventoryDownArrow].rect.top + vs->topline; _string[1].color = v2_mouseover_boxes[kInventoryDownArrow].color; - _messagePtr = (const byte *)" \3\4"; - drawString(1); + drawString(1, (const byte *)" \3\4"); } } @@ -397,19 +395,18 @@ void ScummEngine::drawVerb(int verb, int mode) { verb += _inventoryOffset; */ - _messagePtr = getResourceAddress(rtVerb, verb); - if (!_messagePtr) + const byte *msg = getResourceAddress(rtVerb, verb); + if (!msg) return; - assert(_messagePtr); - if ((_version == 8) && (_messagePtr[0] == '/')) { - translateText(_messagePtr, _transText); - _messagePtr = _transText; + if ((_version == 8) && (msg[0] == '/')) { + translateText(msg, _transText); + msg = _transText; } tmp = _charset->_center; _charset->_center = 0; - drawString(4); + drawString(4, msg); _charset->_center = tmp; vs->curRect.right = _charset->_str.right;