diff options
-rw-r--r-- | engines/parallaction/callables_ns.cpp | 76 | ||||
-rw-r--r-- | engines/parallaction/graphics.cpp | 156 | ||||
-rw-r--r-- | engines/parallaction/graphics.h | 37 | ||||
-rw-r--r-- | engines/parallaction/gui_ns.cpp | 61 | ||||
-rw-r--r-- | engines/parallaction/objects.cpp | 18 | ||||
-rw-r--r-- | engines/parallaction/objects.h | 11 | ||||
-rw-r--r-- | engines/parallaction/parallaction.cpp | 6 | ||||
-rw-r--r-- | engines/parallaction/parallaction_ns.cpp | 11 |
8 files changed, 237 insertions, 139 deletions
diff --git a/engines/parallaction/callables_ns.cpp b/engines/parallaction/callables_ns.cpp index 9ecc8b5b07..51145dabaa 100644 --- a/engines/parallaction/callables_ns.cpp +++ b/engines/parallaction/callables_ns.cpp @@ -384,42 +384,36 @@ void Parallaction_ns::_c_frankenstein(void *parm) { void Parallaction_ns::_c_finito(void *parm) { - const char **v8C = endMsg0; - const char **v7C = endMsg1; - const char **v6C = endMsg2; - const char **v5C = endMsg3; - const char **v4C = endMsg4; - const char **v3C = endMsg5; - const char **v2C = endMsg6; - const char **v1C = endMsg7; - setPartComplete(_char); cleanInventory(); _gfx->setPalette(_gfx->_palette); - _gfx->setFont(_menuFont); - _gfx->setFontShadow(true); + uint id[4]; if (allPartsComplete()) { - _gfx->displayCenteredString(70, v4C[_language]); - _gfx->displayCenteredString(100, v3C[_language]); - _gfx->displayCenteredString(130, v2C[_language]); - _gfx->displayCenteredString(160, v1C[_language]); + id[0] = _gfx->createLabel(_menuFont, endMsg4[_language], 1); + id[1] = _gfx->createLabel(_menuFont, endMsg5[_language], 1); + id[2] = _gfx->createLabel(_menuFont, endMsg6[_language], 1); + id[3] = _gfx->createLabel(_menuFont, endMsg7[_language], 1); + } else { + id[0] = _gfx->createLabel(_menuFont, endMsg0[_language], 1); + id[1] = _gfx->createLabel(_menuFont, endMsg1[_language], 1); + id[2] = _gfx->createLabel(_menuFont, endMsg2[_language], 1); + id[3] = _gfx->createLabel(_menuFont, endMsg3[_language], 1); + } - _gfx->updateScreen(); - waitUntilLeftClick(); + _gfx->showLabel(id[0], CENTER_LABEL_HORIZONTAL, 70); + _gfx->showLabel(id[1], CENTER_LABEL_HORIZONTAL, 100); + _gfx->showLabel(id[2], CENTER_LABEL_HORIZONTAL, 130); + _gfx->showLabel(id[3], CENTER_LABEL_HORIZONTAL, 160); + waitUntilLeftClick(); + + _gfx->freeLabels(); + if (allPartsComplete()) { scheduleLocationSwitch("estgrotta.drki"); } else { - _gfx->displayCenteredString(70, v8C[_language]); - _gfx->displayCenteredString(100, v7C[_language]); - _gfx->displayCenteredString(130, v6C[_language]); - _gfx->displayCenteredString(160, v5C[_language]); - - _gfx->updateScreen(); - waitUntilLeftClick(); - selectStartLocation(); } @@ -439,14 +433,12 @@ void Parallaction_ns::_c_testResult(void *parm) { _disk->selectArchive("disk1"); parseLocation("common"); - _gfx->setFont(_menuFont); - _gfx->setFontShadow(true); + uint id[2]; + id[0] = _gfx->createLabel(_menuFont, _slideText[0], 1); + id[1] = _gfx->createLabel(_menuFont, _slideText[1], 1); - _gfx->displayCenteredString(38, _slideText[0]); - _gfx->displayCenteredString(58, _slideText[1]); - - _gfx->copyScreen(Gfx::kBitFront, Gfx::kBitBack); - _gfx->copyScreen(Gfx::kBitFront, Gfx::kBit2); + _gfx->showLabel(id[0], CENTER_LABEL_HORIZONTAL, 38); + _gfx->showLabel(id[1], CENTER_LABEL_HORIZONTAL, 58); return; } @@ -485,14 +477,15 @@ void Parallaction_ns::_c_startIntro(void *parm) { void Parallaction_ns::_c_endIntro(void *parm) { - _gfx->setFont(_menuFont); - _gfx->setFontShadow(true); - debugC(1, kDebugExec, "endIntro()"); + uint id[2]; for (uint16 _si = 0; _si < 6; _si++) { - _gfx->displayCenteredString(80, _credits[_si]._role); - _gfx->displayCenteredString(100, _credits[_si]._name); + id[0] = _gfx->createLabel(_menuFont, _credits[_si]._role, 1); + id[1] = _gfx->createLabel(_menuFont, _credits[_si]._name, 1); + + _gfx->showLabel(id[0], CENTER_LABEL_HORIZONTAL, 80); + _gfx->showLabel(id[1], CENTER_LABEL_HORIZONTAL, 100); _gfx->updateScreen(); @@ -505,18 +498,21 @@ void Parallaction_ns::_c_endIntro(void *parm) { waitTime( 1 ); } - _gfx->copyScreen(Gfx::kBitBack, Gfx::kBitFront); + _gfx->freeLabels(); } debugC(1, kDebugExec, "endIntro(): done showing credits"); _soundMan->stopMusic(); if ((getFeatures() & GF_DEMO) == 0) { - _gfx->displayCenteredString(80, "CLICK MOUSE BUTTON TO START"); - _gfx->updateScreen(); + + id[0] = _gfx->createLabel(_menuFont, "CLICK MOUSE BUTTON TO START", 1); + _gfx->showLabel(id[0], CENTER_LABEL_HORIZONTAL, 80); waitUntilLeftClick(); + _gfx->freeLabels(); + _engineFlags &= ~kEngineBlockInput; selectStartLocation(); diff --git a/engines/parallaction/graphics.cpp b/engines/parallaction/graphics.cpp index fb62c34e87..37e4f781ee 100644 --- a/engines/parallaction/graphics.cpp +++ b/engines/parallaction/graphics.cpp @@ -360,7 +360,7 @@ void Gfx::updateScreen() { drawItems(); drawBalloons(); - drawLabel(); + drawLabels(); g_system->updateScreen(); return; @@ -541,17 +541,82 @@ Label *Gfx::renderFloatingLabel(Font *font, char *text) { return label; } +uint Gfx::createLabel(Font *font, const char *text, byte color) { + assert(_numLabels < MAX_NUM_LABELS); -void Gfx::setLabel(Label *label) { - _label = label; + Label *label = new Label; + Graphics::Surface *cnv = &label->_cnv; + + uint w, h; + + if (_vm->getPlatform() == Common::kPlatformAmiga) { + w = font->getStringWidth(text) + 2; + h = font->height() + 2; + + cnv->create(w, h, 1); + cnv->fillRect(Common::Rect(w,h), LABEL_TRANSPARENT_COLOR); + + font->setColor(0); + font->drawString((byte*)cnv->getBasePtr(0, 2), cnv->pitch, text); + font->setColor(color); + font->drawString((byte*)cnv->getBasePtr(2, 0), cnv->pitch, text); + } else { + w = font->getStringWidth(text); + h = font->height(); + + cnv->create(w, h, 1); + cnv->fillRect(Common::Rect(w,h), LABEL_TRANSPARENT_COLOR); + + font->setColor(color); + font->drawString((byte*)cnv->getBasePtr(0, 0), cnv->pitch, text); + } + + uint id = _numLabels; + _labels[id] = label; + _numLabels++; + + return id; +} + +void Gfx::showLabel(uint id, int16 x, int16 y) { + assert(id < _numLabels); + _labels[id]->_visible = true; + + if (x == CENTER_LABEL_HORIZONTAL) { + x = CLIP<int16>((_vm->_screenWidth - _labels[id]->_cnv.w) / 2, 0, _vm->_screenWidth/2); + } + + if (y == CENTER_LABEL_VERTICAL) { + y = CLIP<int16>((_vm->_screenHeight - _labels[id]->_cnv.h) / 2, 0, _vm->_screenHeight/2); + } + + _labels[id]->_pos.x = x; + _labels[id]->_pos.y = y; +} + +void Gfx::hideLabel(uint id) { + assert(id < _numLabels); + _labels[id]->_visible = false; +} - if (_label) { - _label->resetPosition(); +void Gfx::freeLabels() { + for (uint i = 0; i < _numLabels; i++) { + delete _labels[i]; } + _numLabels = 0; } -void Gfx::drawLabel() { - if (!_label) { + +void Gfx::setFloatingLabel(Label *label) { + _floatingLabel = label; + + if (_floatingLabel) { + _floatingLabel->resetPosition(); + } +} + +void Gfx::updateFloatingLabel() { + if (!_floatingLabel) { return; } @@ -561,30 +626,67 @@ void Gfx::drawLabel() { _vm->getCursorPos(cursor); if (_vm->_activeItem._id != 0) { - _si = cursor.x + 16 - _label->_cnv.w/2; + _si = cursor.x + 16 - _floatingLabel->_cnv.w/2; _di = cursor.y + 34; } else { - _si = cursor.x + 8 - _label->_cnv.w/2; + _si = cursor.x + 8 - _floatingLabel->_cnv.w/2; _di = cursor.y + 21; } if (_si < 0) _si = 0; if (_di > 190) _di = 190; - if (_label->_cnv.w + _si > _vm->_screenWidth) - _si = _vm->_screenWidth - _label->_cnv.w; + if (_floatingLabel->_cnv.w + _si > _vm->_screenWidth) + _si = _vm->_screenWidth - _floatingLabel->_cnv.w; - _label->_pos.x = _si; - _label->_pos.y = _di; + _floatingLabel->_pos.x = _si; + _floatingLabel->_pos.y = _di; +} - Common::Rect r(_label->_cnv.w, _label->_cnv.h); - r.moveTo(_label->_pos); +void Gfx::drawLabels() { + if ((!_floatingLabel) && (_numLabels == 0)) { + return; + } + updateFloatingLabel(); Graphics::Surface* surf = g_system->lockScreen(); - flatBlit(r, (byte*)_label->_cnv.getBasePtr(0, 0), surf, LABEL_TRANSPARENT_COLOR); + + for (uint i = 0; i < _numLabels; i++) { + if (_labels[i]->_visible) { + Common::Rect r(_labels[i]->_cnv.w, _labels[i]->_cnv.h); + r.moveTo(_labels[i]->_pos); + flatBlit(r, (byte*)_labels[i]->_cnv.getBasePtr(0, 0), surf, LABEL_TRANSPARENT_COLOR); + } + } + + if (_floatingLabel) { + Common::Rect r(_floatingLabel->_cnv.w, _floatingLabel->_cnv.h); + r.moveTo(_floatingLabel->_pos); + flatBlit(r, (byte*)_floatingLabel->_cnv.getBasePtr(0, 0), surf, LABEL_TRANSPARENT_COLOR); + } + g_system->unlockScreen(); } +Label::Label() { + resetPosition(); + _visible = false; +} + +Label::~Label() { + free(); +} + +void Label::free() { + _cnv.free(); + resetPosition(); +} + +void Label::resetPosition() { + _pos.x = -1000; + _pos.y = -1000; +} + // // Cnv management @@ -701,25 +803,6 @@ void Gfx::restoreGetBackground(const Common::Rect& r, byte *data) { -void Gfx::displayString(uint16 x, uint16 y, const char *text, byte color) { - byte *dst = (byte*)_buffers[kBitFront]->getBasePtr(x, y); - if (_fontShadow) { - dst = (byte*)_buffers[kBitFront]->getBasePtr(x-2, y+2); - _font->setColor(0); - _font->drawString(dst, _vm->_screenWidth, text); - } - - dst = (byte*)_buffers[kBitFront]->getBasePtr(x, y); - _font->setColor(color); - _font->drawString(dst, _vm->_screenWidth, text); -} - -void Gfx::displayCenteredString(uint16 y, const char *text) { - uint16 x = (_vm->_screenWidth - getStringWidth(text)) / 2; - displayString(x, y, text, 1); -} - - uint16 Gfx::getStringWidth(const char *text) { return _font->getStringWidth(text); } @@ -865,7 +948,8 @@ Gfx::Gfx(Parallaction* vm) : _numBalloons = 0; _numItems = 0; - _label = 0; + _numLabels = 0; + _floatingLabel = 0; _screenX = 0; _screenY = 0; diff --git a/engines/parallaction/graphics.h b/engines/parallaction/graphics.h index a40dc5dc37..ac42e116e6 100644 --- a/engines/parallaction/graphics.h +++ b/engines/parallaction/graphics.h @@ -220,6 +220,25 @@ public: }; +#define CENTER_LABEL_HORIZONTAL -1 +#define CENTER_LABEL_VERTICAL -1 + +struct Label { + Graphics::Surface _cnv; + + Common::Point _pos; + bool _visible; + + Label(); + ~Label(); + + void free(); + void resetPosition(); +}; + + + + #define NUM_BUFFERS 4 #define MAX_BALLOON_WIDTH 130 @@ -243,16 +262,19 @@ public: public: // balloons and text - void displayString(uint16 x, uint16 y, const char *text, byte color); - void displayCenteredString(uint16 y, const char *text); uint16 getStringWidth(const char *text); void getStringExtent(char *text, uint16 maxwidth, int16* width, int16* height); // labels - Label *_label; - void setLabel(Label *label); + Label *_floatingLabel; + void setFloatingLabel(Label *label); Label *renderFloatingLabel(Font *font, char *text); + uint createLabel(Font *font, const char *text, byte color); + void showLabel(uint id, int16 x, int16 y); + void hideLabel(uint id); + void freeLabels(); + // cut/paste void flatBlitCnv(Graphics::Surface *cnv, int16 x, int16 y, Gfx::Buffers buffer); void flatBlitCnv(Frames *cnv, uint16 frame, int16 x, int16 y, Gfx::Buffers buffer); @@ -354,8 +376,13 @@ protected: uint _numItems; + #define MAX_NUM_LABELS 5 + Label* _labels[MAX_NUM_LABELS]; + uint _numLabels; + void drawInventory(); - void drawLabel(); + void updateFloatingLabel(); + void drawLabels(); void drawItems(); void drawBalloons(); diff --git a/engines/parallaction/gui_ns.cpp b/engines/parallaction/gui_ns.cpp index 9f8cfff012..8b9a9abbcf 100644 --- a/engines/parallaction/gui_ns.cpp +++ b/engines/parallaction/gui_ns.cpp @@ -127,9 +127,6 @@ void Parallaction_ns::guiStart() { guiSplash(); - _gfx->setFont(_introFont); - _gfx->setFontShadow(true); - _language = guiChooseLanguage(); _disk->setLanguage(_language); @@ -192,19 +189,21 @@ int Parallaction_ns::guiNewGame() { const char **v14 = introMsg3; - _gfx->setFont(_menuFont); - _gfx->setFontShadow(true); - _disk->selectArchive("disk1"); setBackground("test", NULL, NULL); _gfx->swapBuffers(); - _gfx->displayCenteredString(50, v14[0]); - _gfx->displayCenteredString(70, v14[1]); - _gfx->displayCenteredString(100, v14[2]); - _gfx->displayCenteredString(120, v14[3]); + uint id[4]; + id[0] = _gfx->createLabel(_menuFont, v14[0], 1); + id[1] = _gfx->createLabel(_menuFont, v14[1], 1); + id[2] = _gfx->createLabel(_menuFont, v14[2], 1); + id[3] = _gfx->createLabel(_menuFont, v14[3], 1); + _gfx->showLabel(id[0], CENTER_LABEL_HORIZONTAL, 50); + _gfx->showLabel(id[1], CENTER_LABEL_HORIZONTAL, 70); + _gfx->showLabel(id[2], CENTER_LABEL_HORIZONTAL, 100); + _gfx->showLabel(id[3], CENTER_LABEL_HORIZONTAL, 120); showCursor(false); @@ -217,6 +216,8 @@ int Parallaction_ns::guiNewGame() { showCursor(true); + _gfx->freeLabels(); + if (_mouseButtons != kMouseRightUp) { return START_INTRO; } @@ -259,7 +260,10 @@ uint16 Parallaction_ns::guiChooseLanguage() { // user can choose language in dos version showSlide("lingua"); - _gfx->displayString(60, 30, "SELECT LANGUAGE", 1); + + uint id = _gfx->createLabel(_introFont, "SELECT LANGUAGE", 1); + _gfx->showLabel(id, 60, 30); + setArrowCursor(); int selection = -1; @@ -275,6 +279,8 @@ uint16 Parallaction_ns::guiChooseLanguage() { beep(); + _gfx->freeLabels(); + return selection; } @@ -288,6 +294,10 @@ uint16 Parallaction_ns::guiSelectGame() { uint16 _si = 0; uint16 _di = 3; + uint id0, id1; + id0 = _gfx->createLabel(_introFont, loadGameMsg[_language], 1); + id1 = _gfx->createLabel(_introFont, newGameMsg[_language], 1); + _mouseButtons = kMouseNone; while (_mouseButtons != kMouseLeftUp) { @@ -296,23 +306,24 @@ uint16 Parallaction_ns::guiSelectGame() { _si = (_mousePos.x > 160) ? 1 : 0; if (_si != _di) { - _di = _si; - - _gfx->copyScreen(Gfx::kBitBack, Gfx::kBitFront); if (_si != 0) { // load a game - _gfx->displayString(60, 30, loadGameMsg[_language], 1); + _gfx->hideLabel(id1); + _gfx->showLabel(id0, 60, 30); } else { // new game - _gfx->displayString(60, 30, newGameMsg[_language], 1); + _gfx->hideLabel(id0); + _gfx->showLabel(id1, 60, 30); } - + _di = _si; } _gfx->updateScreen(); g_system->delayMillis(30); } + _gfx->freeLabels(); + return _si ? LOAD_GAME : NEW_GAME; } @@ -391,6 +402,10 @@ int Parallaction_ns::guiSelectCharacter() { bool fail; + uint id[2]; + id[0] = _gfx->createLabel(_introFont, introMsg1[_language], 1); + id[1] = _gfx->createLabel(_introFont, introMsg2[_language], 1); + while (true) { points[0] = 0; @@ -398,7 +413,8 @@ int Parallaction_ns::guiSelectCharacter() { points[2] = 0; fail = false; - _gfx->displayString(60, 30, introMsg1[_language], 1); // displays message + _gfx->hideLabel(id[1]); + _gfx->showLabel(id[0], 60, 30); _di = 0; while (_di < PASSWORD_LEN) { @@ -437,14 +453,17 @@ int Parallaction_ns::guiSelectCharacter() { } _gfx->copyScreen(Gfx::kBitBack, Gfx::kBitFront); - _gfx->displayString(60, 30, introMsg2[_language], 1); + + _gfx->hideLabel(id[0]); + _gfx->showLabel(id[1], 60, 30); + _gfx->updateScreen(); g_system->delayMillis(2000); - - _gfx->copyScreen(Gfx::kBitBack, Gfx::kBitFront); } + _gfx->freeLabels(); + _gfx->setBlackPalette(); _gfx->updateScreen(); diff --git a/engines/parallaction/objects.cpp b/engines/parallaction/objects.cpp index 337e213dfd..5e8760042d 100644 --- a/engines/parallaction/objects.cpp +++ b/engines/parallaction/objects.cpp @@ -194,24 +194,6 @@ uint16 Zone::height() const { return _bottom - _top; } -Label::Label() { - resetPosition(); -} - -Label::~Label() { - free(); -} - -void Label::free() { - _cnv.free(); - resetPosition(); -} - -void Label::resetPosition() { - _pos.x = -1000; - _pos.y = -1000; -} - Answer::Answer() { _text = NULL; _mood = 0; diff --git a/engines/parallaction/objects.h b/engines/parallaction/objects.h index a270ddf0f7..28904c6d9e 100644 --- a/engines/parallaction/objects.h +++ b/engines/parallaction/objects.h @@ -257,17 +257,6 @@ struct TypeData { } }; -struct Label { - Graphics::Surface _cnv; - - Common::Point _pos; - - Label(); - ~Label(); - - void free(); - void resetPosition(); -}; #define ZONENAME_LENGTH 32 diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp index 1cb8e05fa0..182749f367 100644 --- a/engines/parallaction/parallaction.cpp +++ b/engines/parallaction/parallaction.cpp @@ -320,12 +320,12 @@ void Parallaction::processInput(InputData *data) { switch (data->_event) { case kEvEnterZone: debugC(2, kDebugInput, "processInput: kEvEnterZone"); - _gfx->setLabel(data->_label); + _gfx->setFloatingLabel(data->_label); break; case kEvExitZone: debugC(2, kDebugInput, "processInput: kEvExitZone"); - _gfx->setLabel(0); + _gfx->setFloatingLabel(0); break; case kEvAction: @@ -340,7 +340,7 @@ void Parallaction::processInput(InputData *data) { case kEvOpenInventory: _procCurrentHoverItem = -1; _hoverZone = NULL; - _gfx->setLabel(0); + _gfx->setFloatingLabel(0); if (hitZone(kZoneYou, _mousePos.x, _mousePos.y) == 0) { setArrowCursor(); } diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp index 516f20e6c6..609235bb68 100644 --- a/engines/parallaction/parallaction_ns.cpp +++ b/engines/parallaction/parallaction_ns.cpp @@ -184,7 +184,7 @@ void Parallaction_ns::setArrowCursor() { debugC(1, kDebugInput, "setting mouse cursor to arrow"); // this stuff is needed to avoid artifacts with labels and selected items when switching cursors - _gfx->setLabel(0); + _gfx->setFloatingLabel(0); _activeItem._id = 0; _system->setMouseCursor(_mouseArrow, MOUSEARROW_WIDTH, MOUSEARROW_HEIGHT, 0, 0, 0); @@ -298,7 +298,8 @@ void Parallaction_ns::changeLocation(char *location) { // WORKAROUND: this hideLabel has been added to avoid crashes caused by // execution of label jobs after a location switch. The other workaround in // Parallaction::runGame should have been rendered useless by this one. - _gfx->setLabel(0); + _gfx->setFloatingLabel(0); + _gfx->freeLabels(); _hoverZone = NULL; if (_engineFlags & kEngineBlockInput) { @@ -320,10 +321,10 @@ void Parallaction_ns::changeLocation(char *location) { if (locname.hasSlide()) { showSlide(locname.slide()); - _gfx->setFont(_menuFont); - _gfx->displayCenteredString(14, _slideText[0]); // displays text on screen - _gfx->updateScreen(); + uint id = _gfx->createLabel(_menuFont, _slideText[0], 1); + _gfx->showLabel(id, CENTER_LABEL_HORIZONTAL, 14); waitUntilLeftClick(); + _gfx->freeLabels(); } if (locname.hasCharacter()) { |