diff options
Diffstat (limited to 'engines/sherlock/tattoo/tattoo.cpp')
-rw-r--r-- | engines/sherlock/tattoo/tattoo.cpp | 398 |
1 files changed, 2 insertions, 396 deletions
diff --git a/engines/sherlock/tattoo/tattoo.cpp b/engines/sherlock/tattoo/tattoo.cpp index 90d2e5d958..920bef1a4c 100644 --- a/engines/sherlock/tattoo/tattoo.cpp +++ b/engines/sherlock/tattoo/tattoo.cpp @@ -34,13 +34,11 @@ namespace Sherlock { namespace Tattoo { TattooEngine::TattooEngine(OSystem *syst, const SherlockGameDescription *gameDesc) : - SherlockEngine(syst, gameDesc), _darts(this) { - _creditsActive = false; + SherlockEngine(syst, gameDesc), _darts(this), _hangmanWidget(this) { _runningProlog = false; _fastMode = false; _allowFastMode = true; _transparentMenus = true; - _creditSpeed = 4; } TattooEngine::~TattooEngine() { @@ -175,400 +173,8 @@ void TattooEngine::loadInventory() { inv.push_back(InventoryItem(0, inv8, invDesc8, "_LANT02I")); } -void TattooEngine::initCredits() { - Common::SeekableReadStream *stream = _res->load("credits.txt"); - int spacing = _screen->fontHeight() * 2; - int yp = _screen->h(); - - _creditsActive = true; - _creditLines.clear(); - - while (stream->pos() < stream->size()) { - Common::String line = stream->readLine(); - - if (line.hasPrefix("Scroll Speed")) { - const char *p = line.c_str() + 12; - while ((*p < '0') || (*p > '9')) - p++; - - _creditSpeed = atoi(p); - } else if (line.hasPrefix("Y Spacing")) { - const char *p = line.c_str() + 12; - while ((*p < '0') || (*p > '9')) - p++; - - spacing = atoi(p) + _screen->fontHeight() + 1; - } else { - int width = _screen->stringWidth(line) + 2; - - _creditLines.push_back(CreditLine(line, Common::Point((_screen->w() - width) / 2 + 1, yp), width)); - yp += spacing; - } - } - - // Post-processing for finding split lines - for (int l = 0; l < (int)_creditLines.size(); ++l) { - CreditLine &cl = _creditLines[l]; - const char *p = strchr(cl._line.c_str(), '-'); - - if (p != nullptr && p[1] == '>') { - cl._line2 = Common::String(p + 3); - cl._line = Common::String(cl._line.c_str(), p); - - int width = cl._width; - int width1 = _screen->stringWidth(cl._line); - int width2 = _screen->stringWidth(cl._line2); - - int c = 1; - for (int l1 = l + 1; l1 < (int)_creditLines.size(); ++l1) { - if ((p = strchr(_creditLines[l1]._line.c_str(), '-')) != nullptr) { - if (p[1] == '>') { - Common::String line1 = Common::String(_creditLines[l1]._line.c_str(), p); - Common::String line2 = Common::String(p + 3); - - width1 = MAX(width1, _screen->stringWidth(line1)); - - if (_screen->stringWidth(line2) > width2) - width2 = _screen->stringWidth(line2); - ++c; - } else { - break; - } - } else { - break; - } - } - - width = width1 + width2 + _screen->widestChar(); - width1 += _screen->widestChar(); - - for (int l1 = l; l1 < l + c; ++l1) { - _creditLines[l1]._width = width; - _creditLines[l1]._xOffset = width1; - } - - l += c - 1; - } - } - - delete stream; -} - -void TattooEngine::drawCredits() { - Common::Rect screenRect(0, 0, _screen->w(), _screen->h()); - Surface &bb1 = _screen->_backBuffer1; - - for (uint idx = 0; idx < _creditLines.size() && _creditLines[idx]._position.y < _screen->h(); ++idx) { - if (screenRect.contains(_creditLines[idx]._position)) { - if (!_creditLines[idx]._line2.empty()) { - int x1 = _creditLines[idx]._position.x; - int x2 = x1 + _creditLines[idx]._xOffset; - const Common::String &line1 = _creditLines[idx]._line; - const Common::String &line2 = _creditLines[idx]._line2; - - bb1.writeString(line1, Common::Point(x1 - 1, _creditLines[idx]._position.y - 1), 0); - bb1.writeString(line1, Common::Point(x1, _creditLines[idx]._position.y - 1), 0); - bb1.writeString(line1, Common::Point(x1 + 1, _creditLines[idx]._position.y - 1), 0); - - bb1.writeString(line1, Common::Point(x1 - 1, _creditLines[idx]._position.y), 0); - bb1.writeString(line1, Common::Point(x1 + 1, _creditLines[idx]._position.y), 0); - - bb1.writeString(line1, Common::Point(x1 - 1, _creditLines[idx]._position.y + 1), 0); - bb1.writeString(line1, Common::Point(x1, _creditLines[idx]._position.y + 1), 0); - bb1.writeString(line1, Common::Point(x1 + 1, _creditLines[idx]._position.y + 1), 0); - - bb1.writeString(line1, Common::Point(x1, _creditLines[idx]._position.y), INFO_TOP); - - bb1.writeString(line2, Common::Point(x2 - 1, _creditLines[idx]._position.y - 1), 0); - bb1.writeString(line2, Common::Point(x2, _creditLines[idx]._position.y - 1), 0); - bb1.writeString(line2, Common::Point(x2 + 1, _creditLines[idx]._position.y - 1), 0); - - bb1.writeString(line2, Common::Point(x2 - 1, _creditLines[idx]._position.y), 0); - bb1.writeString(line2, Common::Point(x2 + 1, _creditLines[idx]._position.y), 0); - - bb1.writeString(line2, Common::Point(x2 - 1, _creditLines[idx]._position.y + 1), 0); - bb1.writeString(line2, Common::Point(x2, _creditLines[idx]._position.y + 1), 0); - bb1.writeString(line2, Common::Point(x2 + 1, _creditLines[idx]._position.y + 1), 0); - - bb1.writeString(line2, Common::Point(x2, _creditLines[idx]._position.y), INFO_TOP); - } else { - bb1.writeString(_creditLines[idx]._line, Common::Point(_creditLines[idx]._position.x - 1, _creditLines[idx]._position.y - 1), 0); - bb1.writeString(_creditLines[idx]._line, Common::Point(_creditLines[idx]._position.x, _creditLines[idx]._position.y - 1), 0); - bb1.writeString(_creditLines[idx]._line, Common::Point(_creditLines[idx]._position.x + 1, _creditLines[idx]._position.y - 1), 0); - - bb1.writeString(_creditLines[idx]._line, Common::Point(_creditLines[idx]._position.x - 1, _creditLines[idx]._position.y), 0); - bb1.writeString(_creditLines[idx]._line, Common::Point(_creditLines[idx]._position.x + 1, _creditLines[idx]._position.y), 0); - - bb1.writeString(_creditLines[idx]._line, Common::Point(_creditLines[idx]._position.x - 1, _creditLines[idx]._position.y + 1), 0); - bb1.writeString(_creditLines[idx]._line, Common::Point(_creditLines[idx]._position.x, _creditLines[idx]._position.y + 1), 0); - bb1.writeString(_creditLines[idx]._line, Common::Point(_creditLines[idx]._position.x + 1, _creditLines[idx]._position.y + 1), 0); - - bb1.writeString(_creditLines[idx]._line, Common::Point(_creditLines[idx]._position.x, _creditLines[idx]._position.y), INFO_TOP); - } - } - } -} - -void TattooEngine::blitCredits() { - Common::Rect screenRect(0, -_creditSpeed, _screen->w(), _screen->h() + _creditSpeed); - - for (uint idx = 0; idx < _creditLines.size(); ++idx) { - if (screenRect.contains(_creditLines[idx]._position)) { - Common::Rect r(_creditLines[idx]._width, _screen->fontHeight() + 2); - r.moveTo(_creditLines[idx]._position.x, _creditLines[idx]._position.y - 1); - - _screen->slamRect(r); - } - - _creditLines[idx]._position.y -= _creditSpeed; - } -} - -void TattooEngine::eraseCredits() { - Common::Rect screenRect(0, -_creditSpeed, _screen->w(), _screen->h() + _creditSpeed); - - for (uint idx = 0; idx < _creditLines.size(); ++idx) { - if (screenRect.contains(_creditLines[idx]._position)) { - Common::Rect r(_creditLines[idx]._width, _screen->fontHeight() + 3); - r.moveTo(_creditLines[idx]._position.x, _creditLines[idx]._position.y - 1 + _creditSpeed); - - _screen->restoreBackground(r); - } - } - - if (_creditLines[_creditLines.size() - 1]._position.y < -_creditSpeed) { - _creditLines.clear(); - _creditsActive = false; - setFlags(!3000); - } -} - void TattooEngine::doHangManPuzzle() { - char answers[3][10]; - Common::Point lines[3]; - const char *solutions[3]; - int numWide, spacing; - ImageFile *paper; - Common::Point cursorPos; - byte cursorColor = 254; - bool solved = false; - bool done = false; - bool flag = false; - size_t i = 0; - - switch (getLanguage()) { - case Common::FR_FRA: - lines[0] = Common::Point(34, 210); - lines[1] = Common::Point(72, 242); - lines[2] = Common::Point(34, 276); - numWide = 8; - spacing = 19; - paper = new ImageFile("paperf.vgs"); - break; - - case Common::DE_DEU: - lines[0] = Common::Point(44, 73); - lines[1] = Common::Point(56, 169); - lines[2] = Common::Point(47, 256); - numWide = 7; - spacing = 19; - paper = new ImageFile("paperg.vgs"); - break; - - default: - // English - lines[0] = Common::Point(65, 84); - lines[1] = Common::Point(65, 159); - lines[2] = Common::Point(75, 234); - numWide = 5; - spacing = 20; - paper = new ImageFile("paper.vgs"); - break; - } - - ImageFrame &paperFrame = (*paper)[0]; - Common::Rect paperBounds(paperFrame._width, paperFrame._height); - paperBounds.moveTo((_screen->w() - paperFrame._width) / 2, (_screen->h() - paperFrame._height) / 2); - - for (int line = 0; line<3; ++line) { - lines[line].x += paperBounds.left; - lines[line].y += paperBounds.top; - - for (i = 0; i <= (size_t)numWide; ++i) - answers[line][i] = 0; - } - - _screen->_backBuffer1.blitFrom(paperFrame, Common::Point(paperBounds.left + _screen->_currentScroll.x, 0)); - - // If they have already solved the puzzle, put the answer on the graphic - if (readFlags(299)) { - for (int line = 0; line < 3; ++line) { - cursorPos.y = lines[line].y - _screen->fontHeight() - 2; - - for (i = 0; i < strlen(solutions[line]); ++i) { - cursorPos.x = lines[line].x + 8 - _screen->widestChar() / 2 + i * spacing; - _screen->gPrint(Common::Point(cursorPos.x + _screen->widestChar() / 2 - - _screen->charWidth(solutions[line][i]) / 2, cursorPos.y), 0, "%c", solutions[line][i]); - } - } - } - - _screen->slamRect(paperBounds); - cursorPos = Common::Point(lines[0].x + 8 - _screen->widestChar() / 2, lines[0].y - _screen->fontHeight() - 2); - int line = 0; - - // If they have not solved the puzzle, let them solve it here - if (!readFlags(299)) { - do { - while (!_events->kbHit()) { - // See if a key or a mouse button is pressed - _events->pollEventsAndWait(); - _events->setButtonState(); - - flag = !flag; - if (flag) { - _screen->_backBuffer1.fillRect(Common::Rect(cursorPos.x + _screen->_currentScroll.x, cursorPos.y, - cursorPos.x + _screen->widestChar() + _screen->_currentScroll.x - 1, cursorPos.y + _screen->fontHeight() - 1), cursorColor); - if (answers[line][i]) - _screen->gPrint(Common::Point(cursorPos.x + _screen->widestChar() / 2 - _screen->charWidth(answers[line][i]) / 2, - cursorPos.y), 0, "%c", answers[line][i]); - _screen->slamArea(cursorPos.x, cursorPos.y, _screen->widestChar(), _screen->fontHeight()); - } else { - _screen->setDisplayBounds(Common::Rect(cursorPos.x + _screen->_currentScroll.x, cursorPos.y, - cursorPos.x + _screen->widestChar() + _screen->_currentScroll.x, cursorPos.y + _screen->fontHeight())); - _screen->_backBuffer->blitFrom(paperFrame, Common::Point(paperBounds.left + _screen->_currentScroll.x, paperBounds.top)); - _screen->resetDisplayBounds(); - - if (answers[line][i]) - _screen->gPrint(Common::Point(cursorPos.x + _screen->widestChar() / 2 - _screen->charWidth(answers[line][i]) / 2, - cursorPos.y), 0, "%c", answers[line][i]); - _screen->slamArea(cursorPos.x, cursorPos.y, _screen->widestChar(), _screen->fontHeight()); - } - - if (!_events->kbHit()) - _events->wait(2); - } - - if (_events->kbHit()) { - Common::KeyState keyState = _events->getKey(); - - if (((toupper(keyState.ascii) >= 'A') && (toupper(keyState.ascii) <= 'Z')) || - ((keyState.ascii >= 128) && ((keyState.ascii <= 168) || (keyState.ascii == 225)))) { - answers[line][i] = keyState.ascii; - keyState.keycode = Common::KEYCODE_RIGHT; - } - - _screen->setDisplayBounds(Common::Rect(cursorPos.x + _screen->_currentScroll.x, cursorPos.y, - cursorPos.x + _screen->widestChar() + _screen->_currentScroll.x, cursorPos.y + _screen->fontHeight())); - _screen->_backBuffer->blitFrom(paperFrame, Common::Point(paperBounds.left + _screen->_currentScroll.x, paperBounds.top)); - _screen->resetDisplayBounds(); - - if (answers[line][i]) - _screen->gPrint(Common::Point(cursorPos.x + _screen->widestChar() / 2 - _screen->charWidth(answers[line][i]) / 2, - cursorPos.y), 0, "%c", answers[line][i]); - _screen->slamArea(cursorPos.x, cursorPos.y, _screen->widestChar(), _screen->fontHeight()); - - switch (keyState.keycode) { - case Common::KEYCODE_ESCAPE: - done = true; - break; - - case Common::KEYCODE_UP: - case Common::KEYCODE_KP8: - if (line) { - line--; - if (i >= strlen(solutions[line])) - i = strlen(solutions[line]) - 1; - } - break; - - case Common::KEYCODE_DOWN: - case Common::KEYCODE_KP2: - if (line < 2) { - ++line; - if (i >= strlen(solutions[line])) - i = strlen(solutions[line]) - 1; - } - break; - - case Common::KEYCODE_BACKSPACE: - case Common::KEYCODE_LEFT: - case Common::KEYCODE_KP4: - if (i) - --i; - else if (line) { - --line; - - i = strlen(solutions[line]) - 1; - } - - if (keyState.keycode == Common::KEYCODE_BACKSPACE) - answers[line][i] = ' '; - break; - - case Common::KEYCODE_RIGHT: - case Common::KEYCODE_KP6: - if (i < strlen(solutions[line]) - 1) - i++; - else if (line < 2) { - ++line; - i = 0; - } - break; - - case Common::KEYCODE_DELETE: - answers[line][i] = ' '; - break; - - default: - break; - } - } - - cursorPos.x = lines[line].x + 8 - _screen->widestChar() / 2 + i * spacing; - cursorPos.y = lines[line].y - _screen->fontHeight() - 2; - - // See if all of their anwers are correct - if (!scumm_stricmp(answers[0], solutions[0]) && !scumm_stricmp(answers[1], solutions[1]) && - !scumm_stricmp(answers[2], solutions[2])) { - done = true; - solved = true; - } - } while (!done && !shouldQuit()); - } else { - // They have already solved the puzzle, so just display the solution and wait for a mouse or key click - do { - _events->pollEventsAndWait(); - _events->setButtonState(); - - if ((_events->kbHit()) || (_events->_released) || (_events->_rightReleased)) { - done = true; - _events->clearEvents(); - } - } while (!done && !shouldQuit()); - } - - delete paper; - _screen->_backBuffer1.blitFrom(_screen->_backBuffer2, Common::Point(paperBounds.left + _screen->_currentScroll.x, paperBounds.top), - Common::Rect(paperBounds.left + _screen->_currentScroll.x, paperBounds.top, - paperBounds.right + _screen->_currentScroll.x, paperBounds.bottom)); - _scene->doBgAnim(); - - _screen->slamArea(paperBounds.left + _screen->_currentScroll.x, paperBounds.top, - paperBounds.width(), paperBounds.height()); - - // Don't call the talk files if the puzzle has already been solved - if (readFlags(299)) - return; - - // If they solved the puzzle correctly, set the solved flag and run the appropriate talk scripts - if (solved) { - _talk->talkTo("SLVE12S.TLK"); - _talk->talkTo("WATS12X.TLK"); - setFlags(299); - } else { - _talk->talkTo("HOLM12X.TLK"); - } + _hangmanWidget.show(); } } // End of namespace Tattoo |