aboutsummaryrefslogtreecommitdiff
path: root/engines/sherlock/tattoo/tattoo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sherlock/tattoo/tattoo.cpp')
-rw-r--r--engines/sherlock/tattoo/tattoo.cpp398
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