diff --git a/engines/nancy/module.mk b/engines/nancy/module.mk index 21d49ca320e..128025c9e2f 100644 --- a/engines/nancy/module.mk +++ b/engines/nancy/module.mk @@ -18,6 +18,7 @@ MODULE_OBJS = \ ui/fullscreenimage.o \ ui/button.o \ ui/inventorybox.o \ + ui/ornaments.o \ ui/scrollbar.o \ ui/textbox.o \ ui/viewport.o \ diff --git a/engines/nancy/state/scene.cpp b/engines/nancy/state/scene.cpp index 471107984ab..84d216c0319 100644 --- a/engines/nancy/state/scene.cpp +++ b/engines/nancy/state/scene.cpp @@ -34,6 +34,7 @@ #include "engines/nancy/state/scene.h" #include "engines/nancy/ui/button.h" +#include "engines/nancy/ui/ornaments.h" namespace Common { DECLARE_SINGLETON(Nancy::State::Scene); @@ -101,6 +102,8 @@ Scene::Scene() : _inventoryBox(_frame), _menuButton(nullptr), _helpButton(nullptr), + _viewportOrnaments(nullptr), + _textboxOrnaments(nullptr), _actionManager(), _difficulty(0), _activePrimaryVideo(nullptr) {} @@ -108,6 +111,8 @@ Scene::Scene() : Scene::~Scene() { delete _helpButton; delete _menuButton; + delete _viewportOrnaments; + delete _textboxOrnaments; } void Scene::process() { @@ -285,12 +290,28 @@ void Scene::registerGraphics() { _viewport.registerGraphics(); _textbox.registerGraphics(); _inventoryBox.registerGraphics(); - _menuButton->registerGraphics(); - _helpButton->registerGraphics(); + + if (_menuButton) { + _menuButton->registerGraphics(); + _menuButton->setVisible(false); + } + + if (_helpButton) { + _helpButton->registerGraphics(); + _helpButton->setVisible(false); + } + + if (_viewportOrnaments) { + _viewportOrnaments->registerGraphics(); + _viewportOrnaments->setVisible(true); + } + + if (_textboxOrnaments) { + _textboxOrnaments->registerGraphics(); + _textboxOrnaments->setVisible(true); + } _textbox.setVisible(!_shouldClearTextbox); - _menuButton->setVisible(false); - _helpButton->setVisible(false); } void Scene::synchronize(Common::Serializer &ser) { @@ -644,6 +665,15 @@ void Scene::initStaticData() { _helpButton->init(); g_nancy->_cursorManager->showCursor(true); + // Init ornaments (TVD only) + if (g_nancy->getGameType() == Nancy::GameType::kGameTypeVampire) { + _viewportOrnaments = new UI::ViewportOrnaments(_viewport, 9); + _viewportOrnaments->init(); + + _textboxOrnaments = new UI::TextboxOrnaments(_textbox, 9); + _textboxOrnaments->init(); + } + _state = kLoad; } diff --git a/engines/nancy/state/scene.h b/engines/nancy/state/scene.h index 41c40387c51..76a07d96884 100644 --- a/engines/nancy/state/scene.h +++ b/engines/nancy/state/scene.h @@ -54,6 +54,8 @@ class PlayPrimaryVideoChan0; namespace UI { class Button; +class ViewportOrnaments; +class TextboxOrnaments; } namespace State { @@ -240,6 +242,9 @@ private: UI::Button *_menuButton; UI::Button *_helpButton; + UI::ViewportOrnaments *_viewportOrnaments; + UI::TextboxOrnaments *_textboxOrnaments; + // Data SceneState _sceneState; PlayFlags _flags; diff --git a/engines/nancy/ui/ornaments.cpp b/engines/nancy/ui/ornaments.cpp new file mode 100644 index 00000000000..dc2738c5f66 --- /dev/null +++ b/engines/nancy/ui/ornaments.cpp @@ -0,0 +1,115 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "engines/nancy/ui/ornaments.h" + +#include "engines/nancy/nancy.h" +#include "engines/nancy/graphics.h" +#include "engines/nancy/util.h" + +namespace Nancy { +namespace UI { + +void ViewportOrnaments::init() { + Common::Rect viewportBounds; + Common::SeekableReadStream *viewChunk = g_nancy->getBootChunkStream("VIEW"); + viewChunk->seek(0); + readRect(*viewChunk, _screenPosition); + readRect(*viewChunk, viewportBounds); + + Graphics::ManagedSurface &object0 = g_nancy->_graphicsManager->_object0; + + _drawSurface.create(viewportBounds.width(), viewportBounds.height(), g_nancy->_graphicsManager->getInputPixelFormat()); + + uint8 palette[256 * 3]; + object0.grabPalette(palette, 0, 256); + _drawSurface.setPalette(palette, 0, 256); + + // All values for the viewport ornaments are hardcoded and not stored in a chunk + Common::Rect src[6] = { + { 0, 0, 31, 110 }, + { 49, 0, 81, 110 }, + { 33, 24, 45, 37 }, + { 33, 69, 46, 82 }, + { 33, 0, 43, 22 }, + { 33, 39, 40, 59 } + }; + + _drawSurface.clear(g_nancy->_graphicsManager->getTransColor()); + setTransparent(true); + + // Top left + _drawSurface.blitFrom(object0, src[0], Common::Point(0, 0)); + // Top right + _drawSurface.blitFrom(object0, src[1], Common::Point(viewportBounds.right - src[1].width(), 0)); + // Bottom left + _drawSurface.blitFrom(object0, src[2], Common::Point(0, viewportBounds.bottom - src[2].height())); + // Bottom right + _drawSurface.blitFrom(object0, src[3], Common::Point(viewportBounds.right - src[3].width(), viewportBounds.bottom - src[3].height())); + // Middle left + _drawSurface.blitFrom(object0, src[4], Common::Point(0, 204)); + // Middle right + _drawSurface.blitFrom(object0, src[5], Common::Point(viewportBounds.right - src[5].width(), 205)); + + + RenderObject::init(); +} + +void TextboxOrnaments::init() { + _screenPosition = g_nancy->_textboxScreenPosition; + Common::Rect textboxBounds = _screenPosition; + textboxBounds.moveTo(0, 0); + + Graphics::ManagedSurface &object0 = g_nancy->_graphicsManager->_object0; + + _drawSurface.create(textboxBounds.width(), textboxBounds.height(), g_nancy->_graphicsManager->getInputPixelFormat()); + + uint8 palette[256 * 3]; + object0.grabPalette(palette, 0, 256); + _drawSurface.setPalette(palette, 0, 256); + + _drawSurface.clear(g_nancy->_graphicsManager->getTransColor()); + setTransparent(true); + + // Values for textbox ornaments are stored in the TBOX chunk + Common::Rect src[14]; + Common::Rect dest[14]; + + Common::SeekableReadStream *tboxChunk = g_nancy->getBootChunkStream("TBOX"); + tboxChunk->seek(0x3E); + + for (uint i = 0; i < 14; ++i) { + readRect(*tboxChunk, src[i]); + } + + for (uint i = 0; i < 14; ++i) { + readRect(*tboxChunk, dest[i]); + } + + for (uint i = 0; i < 14; ++i) { + _drawSurface.blitFrom(object0, src[i], Common::Point(dest[i].left - _screenPosition.left, dest[i].top - _screenPosition.top)); + } + + RenderObject::init(); +} + +} // End of namespace UI +} // End of namespace Nancy diff --git a/engines/nancy/ui/ornaments.h b/engines/nancy/ui/ornaments.h new file mode 100644 index 00000000000..119950ee857 --- /dev/null +++ b/engines/nancy/ui/ornaments.h @@ -0,0 +1,50 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef NANCY_UI_ORNAMENTS_H +#define NANCY_UI_ORNAMENTS_H + +#include "engines/nancy/renderobject.h" + +namespace Nancy { +namespace UI { + +class ViewportOrnaments : public Nancy::RenderObject { +public: + ViewportOrnaments(Nancy::RenderObject &redrawFrom, uint16 zOrder) : RenderObject(redrawFrom, zOrder) {} + virtual ~ViewportOrnaments() {} + + void init() override; +}; + +class TextboxOrnaments : public Nancy::RenderObject { +public: + TextboxOrnaments(Nancy::RenderObject &redrawFrom, uint16 zOrder) : RenderObject(redrawFrom, zOrder) {} + virtual ~TextboxOrnaments() {} + + void init() override; +}; + +} // End of namespace Nancy +} // End of namespace Nancy + + +#endif // NANCY_UI_ORNAMENTS_H