aboutsummaryrefslogtreecommitdiff
path: root/engines/sherlock/tattoo
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sherlock/tattoo')
-rw-r--r--engines/sherlock/tattoo/tattoo_scene.cpp3
-rw-r--r--engines/sherlock/tattoo/tattoo_user_interface.cpp16
-rw-r--r--engines/sherlock/tattoo/tattoo_user_interface.h20
-rw-r--r--engines/sherlock/tattoo/widget_base.cpp8
-rw-r--r--engines/sherlock/tattoo/widget_inventory.cpp108
-rw-r--r--engines/sherlock/tattoo/widget_inventory.h15
-rw-r--r--engines/sherlock/tattoo/widget_lab.cpp43
-rw-r--r--engines/sherlock/tattoo/widget_lab.h52
8 files changed, 178 insertions, 87 deletions
diff --git a/engines/sherlock/tattoo/tattoo_scene.cpp b/engines/sherlock/tattoo/tattoo_scene.cpp
index 0f61109c9d..a171da10cc 100644
--- a/engines/sherlock/tattoo/tattoo_scene.cpp
+++ b/engines/sherlock/tattoo/tattoo_scene.cpp
@@ -101,6 +101,9 @@ bool TattooScene::loadScene(const Common::String &filename) {
// Set the menu/ui mode and whether we're in a lab table close-up scene
_labTableScene = _currentScene > 91 && _currentScene < 100;
ui._menuMode = _labTableScene ? LAB_MODE : STD_MODE;
+
+ if (_labTableScene)
+ ui._labWidget.summonWindow();
}
return result;
diff --git a/engines/sherlock/tattoo/tattoo_user_interface.cpp b/engines/sherlock/tattoo/tattoo_user_interface.cpp
index bffdb550cf..e846db2701 100644
--- a/engines/sherlock/tattoo/tattoo_user_interface.cpp
+++ b/engines/sherlock/tattoo/tattoo_user_interface.cpp
@@ -30,7 +30,8 @@ namespace Sherlock {
namespace Tattoo {
TattooUserInterface::TattooUserInterface(SherlockEngine *vm): UserInterface(vm),
- _inventoryWidget(vm), _messageWidget(vm), _textWidget(vm), _tooltipWidget(vm), _verbsWidget(vm) {
+ _inventoryWidget(vm), _messageWidget(vm), _textWidget(vm), _tooltipWidget(vm), _verbsWidget(vm),
+ _labWidget(vm) {
Common::fill(&_lookupTable[0], &_lookupTable[PALETTE_COUNT], 0);
Common::fill(&_lookupTable1[0], &_lookupTable1[PALETTE_COUNT], 0);
_scrollSize = 0;
@@ -222,6 +223,8 @@ void TattooUserInterface::doJournal() {
void TattooUserInterface::reset() {
UserInterface::reset();
_lookPos = Common::Point(SHERLOCK_SCREEN_WIDTH / 2, SHERLOCK_SCREEN_HEIGHT / 2);
+ _tooltipWidget.setText("");
+ _widgets.clear();
}
void TattooUserInterface::handleInput() {
@@ -280,9 +283,6 @@ void TattooUserInterface::handleInput() {
case FILES_MODE:
doFileControl();
break;
- case LAB_MODE:
- doLabControl();
- break;
default:
break;
}
@@ -356,7 +356,6 @@ void TattooUserInterface::doStandardControl() {
Events &events = *_vm->_events;
People &people = *_vm->_people;
TattooScene &scene = *(TattooScene *)_vm->_scene;
- Screen &screen = *_vm->_screen;
Talk &talk = *_vm->_talk;
Common::Point mousePos = events.mousePos();
bool noDesc = false;
@@ -477,7 +476,7 @@ void TattooUserInterface::doStandardControl() {
events._pressed = events._released = false;
} else {
// Walk to where the mouse was clicked
- people[HOLMES]._walkDest = mousePos + screen._currentScroll;
+ people[HOLMES]._walkDest = mousePos;
people[HOLMES].goAllTheWay();
}
}
@@ -527,10 +526,6 @@ void TattooUserInterface::doFileControl() {
warning("TODO: ui control (file)");
}
-void TattooUserInterface::doLabControl() {
- warning("TODO: ui control (lab)");
-}
-
void TattooUserInterface::displayObjectNames() {
Events &events = *_vm->_events;
Scene &scene = *_vm->_scene;
@@ -583,6 +578,7 @@ void TattooUserInterface::putMessage(const char *formatStr, ...) {
va_end(args);
// Open the message widget
+ _menuMode = MESSAGE_MODE;
_messageWidget.load(str, 25);
_messageWidget.summonWindow();
}
diff --git a/engines/sherlock/tattoo/tattoo_user_interface.h b/engines/sherlock/tattoo/tattoo_user_interface.h
index 8dcfaddbd2..7f284531de 100644
--- a/engines/sherlock/tattoo/tattoo_user_interface.h
+++ b/engines/sherlock/tattoo/tattoo_user_interface.h
@@ -29,6 +29,7 @@
#include "sherlock/screen.h"
#include "sherlock/user_interface.h"
#include "sherlock/tattoo/widget_inventory.h"
+#include "sherlock/tattoo/widget_lab.h"
#include "sherlock/tattoo/widget_text.h"
#include "sherlock/tattoo/widget_tooltip.h"
#include "sherlock/tattoo/widget_verbs.h"
@@ -77,17 +78,6 @@ private:
* Handle input while the verb menu is open
*/
void doVerbControl();
-
- /**
- * Handles input when the player is in the Lab Table scene
- */
- void doLabControl();
-
- /**
- * If the mouse cursor is point at the cursor, then display the name of the object on the screen.
- * If there is no object being pointed it, clear any previously displayed name
- */
- void displayObjectNames();
/**
* Set up to display the Files menu
@@ -119,7 +109,7 @@ public:
int _maskCounter;
ImageFile *_interfaceImages;
WidgetText _textWidget;
- Common::String _action;
+ WidgetLab _labWidget;
public:
TattooUserInterface(SherlockEngine *vm);
virtual ~TattooUserInterface();
@@ -197,6 +187,12 @@ public:
* Draws all the dialog rectangles for any items that need them
*/
void drawDialogRect(Surface &s, const Common::Rect &r, bool raised);
+
+ /**
+ * If the mouse cursor is point at the cursor, then display the name of the object on the screen.
+ * If there is no object being pointed it, clear any previously displayed name
+ */
+ void displayObjectNames();
public:
/**
* Resets the user interface
diff --git a/engines/sherlock/tattoo/widget_base.cpp b/engines/sherlock/tattoo/widget_base.cpp
index 5f16e8800d..66ade474c2 100644
--- a/engines/sherlock/tattoo/widget_base.cpp
+++ b/engines/sherlock/tattoo/widget_base.cpp
@@ -35,6 +35,14 @@ WidgetBase::WidgetBase(SherlockEngine *vm) : _vm(vm) {
void WidgetBase::summonWindow() {
TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
+
+ // Double-check that the same widget isn't added twice
+ for (Common::List<WidgetBase *>::iterator i = ui._widgets.begin(); i != ui._widgets.end(); ++i) {
+ if ((*i) == this)
+ error("Tried to add a widget twice");
+ }
+
+ // Add widget to the screen
ui._widgets.push_back(this);
_outsideMenu = false;
diff --git a/engines/sherlock/tattoo/widget_inventory.cpp b/engines/sherlock/tattoo/widget_inventory.cpp
index 241eaca182..170fb02481 100644
--- a/engines/sherlock/tattoo/widget_inventory.cpp
+++ b/engines/sherlock/tattoo/widget_inventory.cpp
@@ -122,17 +122,6 @@ void WidgetInventoryTooltip::handleEvents() {
Common::String strWith = fixedText.getText(kFixedText_With);
Common::String strUse = fixedText.getText(kFixedText_Use);
- // If there's a floating graphic for a selected inventory item, update it's bounds
- if (_owner->_invVerbMode == 2 || _owner->_invVerbMode == 3) {
- _oldInvGraphicBounds = _invGraphicBounds;
-
- // Set the New position of the graphic
- int xp = CLIP(mousePos.x - _invGraphicBounds.width() / 2, 0, SHERLOCK_SCENE_WIDTH - _invGraphicBounds.width());
- int yp = CLIP(mousePos.y - _invGraphicBounds.height() / 2, 0, SHERLOCK_SCREEN_HEIGHT - _invGraphicBounds.height());
-
- _invGraphicBounds.moveTo(xp, yp);
- }
-
// If we are using an inventory item on an object in the room, display the appropriate text above the mouse cursor
if (_owner->_invVerbMode == 3) {
select = ui._bgFound;
@@ -147,18 +136,18 @@ void WidgetInventoryTooltip::handleEvents() {
if (_vm->getLanguage() == Common::GR_GRE) {
if (!_owner->_swapItems)
- str = Common::String::format("%s %s %s %s", ui._action.c_str(), obj._description.c_str(),
- inv[_owner->_invSelect]._name.c_str(), _owner->_invVerb.c_str());
+ str = Common::String::format("%s %s %s %s", _owner->_action.c_str(), obj._description.c_str(),
+ inv[_owner->_invSelect]._name.c_str(), _owner->_verb.c_str());
else
- str = Common::String::format("%s %s %s %s", ui._action.c_str(), inv[_owner->_invSelect]._name.c_str(),
- obj._description.c_str(), _owner->_invVerb.c_str());
+ str = Common::String::format("%s %s %s %s", _owner->_action.c_str(), inv[_owner->_invSelect]._name.c_str(),
+ obj._description.c_str(), _owner->_verb.c_str());
} else {
if (_owner->_swapItems)
- str = Common::String::format("%s %s %s %s", _owner->_invVerb.c_str(), obj._description.c_str(), ui._action.c_str(),
+ str = Common::String::format("%s %s %s %s", _owner->_verb.c_str(), obj._description.c_str(), _owner->_action.c_str(),
inv[_owner->_invSelect]._name.c_str());
else
- str = Common::String::format("%s %s %s %s", _owner->_invVerb.c_str(), inv[_owner->_invSelect]._name.c_str(),
- ui._action.c_str(), obj._description.c_str());
+ str = Common::String::format("%s %s %s %s", _owner->_verb.c_str(), inv[_owner->_invSelect]._name.c_str(),
+ _owner->_action.c_str(), obj._description.c_str());
}
}
} else {
@@ -167,19 +156,19 @@ void WidgetInventoryTooltip::handleEvents() {
if (!person._description.empty() && !person._description.hasPrefix(" ")) {
if (_vm->getLanguage() == Common::GR_GRE) {
if (!_owner->_swapItems)
- str = Common::String::format("%s %s %s %s", ui._action.c_str(), person._description.c_str(),
- inv[_owner->_invSelect]._name.c_str(), _owner->_invVerb.c_str());
+ str = Common::String::format("%s %s %s %s", _owner->_action.c_str(), person._description.c_str(),
+ inv[_owner->_invSelect]._name.c_str(), _owner->_verb.c_str());
else
- str = Common::String::format("%s %s %s %s", ui._action.c_str(), inv[_owner->_invSelect]._name.c_str(),
- person._description.c_str(), _owner->_invVerb.c_str());
+ str = Common::String::format("%s %s %s %s", _owner->_action.c_str(), inv[_owner->_invSelect]._name.c_str(),
+ person._description.c_str(), _owner->_verb.c_str());
} else {
if (_owner->_swapItems)
- str = Common::String::format("%s %s %s %s", _owner->_invVerb.c_str(), person._description.c_str(),
- ui._action.c_str(), inv[_owner->_invSelect]._name.c_str());
+ str = Common::String::format("%s %s %s %s", _owner->_verb.c_str(), person._description.c_str(),
+ _owner->_action.c_str(), inv[_owner->_invSelect]._name.c_str());
else
- str = Common::String::format("%s %s %s %s", _owner->_invVerb.c_str(),
- inv[_owner->_invSelect]._name.c_str(), ui._action.c_str(), person._description.c_str());
+ str = Common::String::format("%s %s %s %s", _owner->_verb.c_str(),
+ inv[_owner->_invSelect]._name.c_str(), _owner->_action.c_str(), person._description.c_str());
}
}
}
@@ -241,6 +230,10 @@ void WidgetInventoryTooltip::handleEvents() {
return;
}
+ if (_owner->_invVerbMode == 3)
+ // Adjust tooltip to be above the inventory item being shown above the standard cursor
+ mousePos.y -= events._hotspotPos.y;
+
// Update the position of the tooltip
int xs = CLIP(mousePos.x - _bounds.width() / 2, 0, SHERLOCK_SCENE_WIDTH - _bounds.width());
int ys = CLIP(mousePos.y - _bounds.height(), 0, SHERLOCK_SCREEN_HEIGHT - _bounds.height());
@@ -267,7 +260,7 @@ void WidgetInventoryVerbs::load() {
_inventCommands.push_back(FIXED(Look));
// Default the Action word to "with"
- _action = _vm->getLanguage() == Common::GR_GRE ? "" : FIXED(With);
+ _owner->_action = _vm->getLanguage() == Common::GR_GRE ? "" : FIXED(With);
// Search all the bgshapes for any matching Target Fields
for (uint idx = 0; idx < scene._bgShapes.size(); ++idx) {
@@ -275,7 +268,7 @@ void WidgetInventoryVerbs::load() {
if (obj._type != INVALID && obj._type != HIDDEN) {
for (int useNum = 0; useNum < 6; ++useNum) {
- if (obj._use[useNum]._verb.hasPrefix("*") &&
+ if (!obj._use[useNum]._verb.hasPrefix("*") &&
!obj._use[useNum]._target.compareToIgnoreCase(inv[_owner->_invSelect]._name)) {
// Make sure the Verb is not already in the list
bool found1 = false;
@@ -293,7 +286,7 @@ void WidgetInventoryVerbs::load() {
if (!scumm_strnicmp(obj._use[useNum]._names[nameNum].c_str(), "*VSWAP", 6))
_owner->_swapItems = true;
else
- _action = Common::String(obj._use[useNum]._names[nameNum].c_str() + 2);
+ _owner->_action = Common::String(obj._use[useNum]._names[nameNum].c_str() + 2);
}
}
}
@@ -428,29 +421,19 @@ void WidgetInventoryVerbs::handleEvents() {
events.clearEvents();
ui.checkAction(inv[_owner->_invSelect]._verb, 2000);
} else {
- _owner->_invVerb = _inventCommands[_invVerbSelect];
+ _owner->_verb = _inventCommands[_invVerbSelect];
}
// If we are still in Inventory Mode, setup the graphic to float in front of the mouse cursor
if (ui._menuMode == INV_MODE) {
+ // Add the inventory item to the cursor
ImageFrame &imgFrame = (*inv._invShapes[_owner->_invSelect - inv._invIndex])[0];
- _owner->_invGraphicBounds = Common::Rect(imgFrame._width, imgFrame._height);
- _owner->_invGraphicBounds.moveTo(mousePos.x - _owner->_invGraphicBounds.width() / 2,
- mousePos.y - _owner->_invGraphicBounds.height() / 2);
-
- // Constrain it to the screen
- if (_owner->_invGraphicBounds.left < 0)
- _owner->_invGraphicBounds.moveTo(0, _owner->_invGraphicBounds.top);
- if (_owner->_invGraphicBounds.top < 0)
- _owner->_invGraphicBounds.moveTo(_owner->_invGraphicBounds.left, 0);
- if (_owner->_invGraphicBounds.right > SHERLOCK_SCREEN_WIDTH)
- _owner->_invGraphicBounds.moveTo(SHERLOCK_SCREEN_WIDTH - _owner->_invGraphicBounds.width(), _owner->_invGraphicBounds.top);
- if (_owner->_invGraphicBounds.bottom > SHERLOCK_SCREEN_HEIGHT)
- _owner->_invGraphicBounds.moveTo(_owner->_invGraphicBounds.left, SHERLOCK_SCREEN_HEIGHT - _owner->_invGraphicBounds.height());
-
- // Make a copy of the inventory image
- _owner->_invGraphic.create(imgFrame._width, imgFrame._height);
- _owner->_invGraphic.blitFrom(imgFrame, Common::Point(0, 0));
+ events.setCursor(ARROW, imgFrame._frame);
+
+ // Close the inventory dialog without banishing it, so it can keep getting events
+ // to handle tooltips and actually making the selection of what object to use them item on
+ inv.freeInv();
+ _owner->_surface.free();
}
}
}
@@ -624,11 +607,7 @@ void WidgetInventory::handleEvents() {
if (_invVerbMode == 3) {
// Selecting object after inventory verb has been selected
_tooltipWidget.banishWindow();
- _invGraphic.free();
- inv.freeInv();
-
- ui._menuMode = scene._labTableScene ? LAB_MODE : STD_MODE;
- events.clearEvents();
+ close();
if (ui._keyState.keycode != Common::KEYCODE_ESCAPE) {
// If user pointed at an item, use the selected inventory item with this item
@@ -636,7 +615,7 @@ void WidgetInventory::handleEvents() {
if (ui._bgFound != -1) {
if (ui._personFound) {
for (int idx = 0; idx < 2; ++idx) {
- if (!people[ui._bgFound - 1000]._use[idx]._verb.compareToIgnoreCase(_invVerb) &&
+ if (!people[ui._bgFound - 1000]._use[idx]._verb.compareToIgnoreCase(_verb) &&
!people[ui._bgFound - 1000]._use[idx]._target.compareToIgnoreCase(_invTarget)) {
ui.checkAction(people[ui._bgFound - 1000]._use[idx], ui._bgFound);
found = true;
@@ -644,7 +623,7 @@ void WidgetInventory::handleEvents() {
}
} else {
for (int idx = 0; idx < 6; ++idx) {
- if (!ui._bgShape->_use[idx]._verb.compareToIgnoreCase(_invVerb) &&
+ if (!ui._bgShape->_use[idx]._verb.compareToIgnoreCase(_verb) &&
!ui._bgShape->_use[idx]._target.compareToIgnoreCase(_invTarget)) {
ui.checkAction(ui._bgShape->_use[idx], ui._bgFound);
found = true;
@@ -658,13 +637,8 @@ void WidgetInventory::handleEvents() {
}
} else if ((_outsideMenu && !_bounds.contains(mousePos)) || ui._keyState.keycode == Common::KEYCODE_ESCAPE) {
// Want to close the window (clicked outside of it). So close the window and return to Standard
- banishWindow();
- inv.freeInv();
+ close();
- events.clearEvents();
- events.setCursor(ARROW);
- banishWindow();
- ui._menuMode = scene._labTableScene ? LAB_MODE : STD_MODE;
} else if (_bounds.contains(mousePos)) {
// Mouse button was released inside the inventory window
_outsideMenu = false;
@@ -769,6 +743,20 @@ void WidgetInventory::erase() {
_tooltipWidget.erase();
}
+void WidgetInventory::close() {
+ Events &events = *_vm->_events;
+ Inventory &inv = *_vm->_inventory;
+ TattooScene &scene = *(TattooScene *)_vm->_scene;
+ TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
+
+ banishWindow();
+ inv.freeInv();
+ events.clearEvents();
+
+ events.setCursor(ARROW);
+ ui._menuMode = scene._labTableScene ? LAB_MODE : STD_MODE;
+}
+
} // End of namespace Tattoo
} // End of namespace Sherlock
diff --git a/engines/sherlock/tattoo/widget_inventory.h b/engines/sherlock/tattoo/widget_inventory.h
index bfc1c7f50f..53bc2038e0 100644
--- a/engines/sherlock/tattoo/widget_inventory.h
+++ b/engines/sherlock/tattoo/widget_inventory.h
@@ -40,7 +40,6 @@ class WidgetInventory;
class WidgetInventoryTooltip: public WidgetTooltipBase {
private:
WidgetInventory *_owner;
- Common::Rect _oldInvGraphicBounds, _invGraphicBounds;
protected:
/**
* Overriden from base class, since tooltips have a completely transparent background
@@ -65,7 +64,6 @@ class WidgetInventoryVerbs : public WidgetBase {
private:
WidgetInventory *_owner;
Common::StringArray _inventCommands;
- Common::String _action;
void highlightControls();
public:
@@ -92,12 +90,9 @@ private:
int _dialogTimer;
WidgetInventoryTooltip _tooltipWidget;
WidgetInventoryVerbs _verbList;
- Common::Rect _invGraphicBounds;
- Surface _invGraphic;
bool _swapItems;
Surface _menuSurface;
Common::String _invTarget;
- Common::String _invVerb;
/**
* Draw the bars within the dialog
@@ -115,10 +110,15 @@ private:
void highlightControls();
public:
int _invMode;
+ Common::String _action;
+ Common::String _verb;
public:
WidgetInventory(SherlockEngine *vm);
virtual ~WidgetInventory() {}
+ /**
+ * Load the inventory window
+ */
void load(int mode);
/**
@@ -127,6 +127,11 @@ public:
void drawInventory();
/**
+ * Close the window
+ */
+ void close();
+
+ /**
* Handle events whilst the widget is on-screen
*/
virtual void handleEvents();
diff --git a/engines/sherlock/tattoo/widget_lab.cpp b/engines/sherlock/tattoo/widget_lab.cpp
new file mode 100644
index 0000000000..47955a0d26
--- /dev/null
+++ b/engines/sherlock/tattoo/widget_lab.cpp
@@ -0,0 +1,43 @@
+/* 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 2
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "sherlock/tattoo/widget_lab.h"
+#include "sherlock/tattoo/tattoo_user_interface.h"
+#include "sherlock/tattoo/tattoo.h"
+
+namespace Sherlock {
+
+namespace Tattoo {
+
+WidgetLab::WidgetLab(SherlockEngine *vm) : WidgetBase(vm) {
+}
+
+void WidgetLab::handleEvents() {
+ Events &events = *_vm->_events;
+ TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
+ WidgetBase::handleEvents();
+
+}
+
+} // End of namespace Tattoo
+
+} // End of namespace Sherlock
diff --git a/engines/sherlock/tattoo/widget_lab.h b/engines/sherlock/tattoo/widget_lab.h
new file mode 100644
index 0000000000..344dae7934
--- /dev/null
+++ b/engines/sherlock/tattoo/widget_lab.h
@@ -0,0 +1,52 @@
+/* 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 2
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SHERLOCK_TATTOO_WIDGET_LAB_H
+#define SHERLOCK_TATTOO_WIDGET_LAB_H
+
+#include "common/scummsys.h"
+#include "sherlock/tattoo/widget_base.h"
+
+namespace Sherlock {
+
+class SherlockEngine;
+
+namespace Tattoo {
+
+class WidgetLab: public WidgetBase {
+public:
+ Common::String _remainingText;
+public:
+ WidgetLab(SherlockEngine *vm);
+ virtual ~WidgetLab() {}
+
+ /**
+ * Handle event processing
+ */
+ virtual void handleEvents();
+};
+
+} // End of namespace Tattoo
+
+} // End of namespace Sherlock
+
+#endif