diff options
-rw-r--r-- | engines/sherlock/inventory.cpp | 12 | ||||
-rw-r--r-- | engines/sherlock/inventory.h | 6 | ||||
-rw-r--r-- | engines/sherlock/user_interface.cpp | 241 | ||||
-rw-r--r-- | engines/sherlock/user_interface.h | 9 |
4 files changed, 267 insertions, 1 deletions
diff --git a/engines/sherlock/inventory.cpp b/engines/sherlock/inventory.cpp index a05ec6f359..75ee364123 100644 --- a/engines/sherlock/inventory.cpp +++ b/engines/sherlock/inventory.cpp @@ -124,4 +124,16 @@ void Inventory::invent(int flag) { // TODO } +void Inventory::invCommands(bool slamIt) { + // TODO +} + +void Inventory::doInvLite(int index, byte color) { + // TODO +} + +void Inventory::doInvJF() { + // TODO +} + } // End of namespace Sherlock diff --git a/engines/sherlock/inventory.h b/engines/sherlock/inventory.h index 6d61378b99..0fa8eb0824 100644 --- a/engines/sherlock/inventory.h +++ b/engines/sherlock/inventory.h @@ -65,6 +65,12 @@ public: void putInv(int slamit); void invent(int flag); + + void invCommands(bool slamIt); + + void doInvLite(int index, byte color); + + void doInvJF(); }; } // End of namespace Sherlock diff --git a/engines/sherlock/user_interface.cpp b/engines/sherlock/user_interface.cpp index 61933cf9f3..10b13cedbe 100644 --- a/engines/sherlock/user_interface.cpp +++ b/engines/sherlock/user_interface.cpp @@ -77,12 +77,14 @@ UserInterface::UserInterface(SherlockEngine *vm) : _vm(vm) { _oldLook = false; _keyboardInput = false; _invMode = 0; + _invIndex = 0; _pause = false; _cNum = 0; _selector = _oldSelector = -1; _windowBounds = Common::Rect(0, CONTROLS_Y1, SHERLOCK_SCREEN_WIDTH - 1, SHERLOCK_SCREEN_HEIGHT - 1); _windowStyle = 1; // Sliding windows + _find = 0; } UserInterface::~UserInterface() { @@ -451,6 +453,10 @@ void UserInterface::toggleButton(int num) { } } +void UserInterface::buttonPrint(const Common::Point &pt, int color, bool slamIt, + const Common::String &str) { + // TODO +} /** * Clears the info line of the screen @@ -536,8 +542,235 @@ void UserInterface::doEnvControl() { // TODO } +/** + * Handle input whilst the inventory is active + */ void UserInterface::doInvControl() { - // TODO + Events &events = *_vm->_events; + Inventory &inv = *_vm->_inventory; + Scene &scene = *_vm->_scene; + Screen &screen = *_vm->_screen; + Talk &talk = *_vm->_talk; + const char INVENTORY_COMMANDS[9] = { "ELUG-+,." }; + int colors[8]; + Common::Point mousePos = events.mousePos(); + + _key = _oldKey = -1; + _keyboardInput = false; + + // Check whether any inventory slot is highlighted + int found = -1; + Common::fill(&colors[0], &colors[8], (int)COMMAND_FOREGROUND); + for (int idx = 0; idx < 8; ++idx) { + Common::Rect r(INVENTORY_POINTS[idx][0], CONTROLS_Y1, + INVENTORY_POINTS[idx][1], CONTROLS_Y1 + 10); + if (r.contains(mousePos)) { + found = idx; + break; + } + } + + if (events._pressed || events._released) { + events.clearKeyboard(); + + if (found != -1) + // If a slot highlighted, set it's color + colors[found] = COMMAND_HIGHLIGHTED; + buttonPrint(Common::Point(INVENTORY_POINTS[0][2], CONTROLS_Y1), + colors[0], true, "Exit"); + + if (found >= 0 && found <= 3) { + buttonPrint(Common::Point(INVENTORY_POINTS[1][2], CONTROLS_Y1), colors[1], true, "Look"); + buttonPrint(Common::Point(INVENTORY_POINTS[2][2], CONTROLS_Y1), colors[1], true, "Use"); + buttonPrint(Common::Point(INVENTORY_POINTS[3][2], CONTROLS_Y1), colors[1], true, "Give"); + _invMode = found; + _selector = -1; + } + + if (_invIndex) { + screen.print(Common::Point(INVENTORY_POINTS[4][2], CONTROLS_Y1 + 1), + colors[4], "^^"); + screen.print(Common::Point(INVENTORY_POINTS[5][2], CONTROLS_Y1 + 1), + colors[5], "^"); + } + + if ((inv._holdings - _invIndex) > 6) { + screen.print(Common::Point(INVENTORY_POINTS[6][2], CONTROLS_Y1 + 1), + colors[6], "^^"); + screen.print(Common::Point(INVENTORY_POINTS[7][2], CONTROLS_Y1 + 1), + colors[7], "^"); + } + + bool flag = false; + if (_invMode == 1 || _invMode == 2 || _invMode == 3) { + Common::Rect r(15, CONTROLS_Y1 + 11, 314, SHERLOCK_SCREEN_HEIGHT - 2); + flag = (_selector < inv._holdings); + } + + if (!flag && mousePos.y >(CONTROLS_Y1 + 11)) + _selector = -1; + } + + if (_keycode != Common::KEYCODE_INVALID) { + _key = toupper(_keycode); + + if (_key == Common::KEYCODE_ESCAPE) + // Escape will also 'E'xit out of inventory display + _key = Common::KEYCODE_e; + + if (_key == 'E' || _key == 'L' || _key == 'U' || _key == 'G' + || _key == '-' || _key == '+') { + int temp = _invMode; + + const char *chP = strchr(INVENTORY_COMMANDS, _key); + _invMode = !chP ? 8 : chP - INVENTORY_COMMANDS; + inv.invCommands(true); + + _invMode = temp; + _keyboardInput = true; + if (_key == 'E') + _invMode = STD_MODE; + _selector = -1; + } else { + _selector = -1; + } + } + + if (_selector != _oldSelector) { + if (_oldSelector != -1) { + // Un-highlight + if (_oldSelector >= _invIndex && _oldSelector < (_invIndex + 6)) + inv.doInvLite(_oldSelector, BUTTON_MIDDLE); + } + + if (_selector != -1) + inv.doInvLite(_selector, 235); + + _oldSelector = _selector; + } + + if (events._released || _keyboardInput) { + if ((!found && events._released) && _key == 'E') { + inv.freeInv(); + _infoFlag = true; + clearInfo(); + banishWindow(false); + _key = -1; + events.clearEvents(); + events.setCursor(ARROW); + } else if ((found == 1 && events._released) || (_key == 'L')) { + _invMode = 1; + } else if ((found == 2 && events._released) || (_key == 'U')) { + _invMode = 2; + } else if ((found == 3 && events._released) || (_key == 'G')) { + _invMode = 3; + } else if (((found == 4 && events._released) || _key == ',') && _invIndex) { + if (_invIndex >= 6) + _invIndex -= 6; + else + _invIndex = 0; + + screen.print(Common::Point(INVENTORY_POINTS[4][2], CONTROLS_Y1 + 1), + COMMAND_HIGHLIGHTED, "^^"); + inv.freeGraphics(); + inv.loadGraphics(); + inv.putInv(1); + inv.invCommands(true); + } else if (((found == 5 && events._released) || _key == '-') && _invIndex) { + --_invIndex; + screen.print(Common::Point(INVENTORY_POINTS[4][2], CONTROLS_Y1 + 1), + COMMAND_HIGHLIGHTED, "^"); + inv.freeGraphics(); + inv.loadGraphics(); + inv.putInv(1); + inv.invCommands(true); + } else if (((found == 6 && events._released) || _key == '+') && (inv._holdings - _invIndex) > 6) { + ++_invIndex; + screen.print(Common::Point(INVENTORY_POINTS[6][2], CONTROLS_Y1 + 1), + COMMAND_HIGHLIGHTED, "_"); + inv.freeGraphics(); + inv.loadGraphics(); + inv.putInv(1); + inv.invCommands(true); + } else if (((found == 7 && events._released) || _key == '.') && (inv._holdings - _invIndex) > 6) { + _invIndex += 6; + if ((inv._holdings - 6) < _invIndex) + _invIndex = inv._holdings - 6; + + screen.print(Common::Point(INVENTORY_POINTS[7][2], CONTROLS_Y1 + 1), + COMMAND_HIGHLIGHTED, "_"); + inv.freeGraphics(); + inv.loadGraphics(); + inv.putInv(1); + inv.invCommands(true); + } else { + // If something is being given, make sure it's to a person + if (_invMode == 3) { + if (_bgFound != -1 && scene._bgShapes[_bgFound]._aType == PERSON) + _find = _bgFound; + else + _find = -1; + } else { + _find = _bgFound; + } + + if ((mousePos.y < CONTROLS_Y1) && (_invMode == 1) && (_find >= 0) && (_find < 1000)) { + if (!scene._bgShapes[_find]._examine.empty() && + scene._bgShapes[_find]._examine[0] >= ' ') + inv.doInvJF(); + } else if (_selector != -1 || _find >= 0) { + // Selector is the inventory object that was clicked on, or selected. + // If it's -1, then no inventory item is highlighted yet. Otherwise, + // an object in the scene has been clicked. + + if (_selector != -1 && _invMode == 1 && mousePos.y >(CONTROLS_Y1 + 11)) + inv.doInvJF(); + + if (talk._talkToAbort) + return; + + // Now check for the Use and Give actions. If inv_mode is 3, + // that means GIVE is in effect, _selector is the object being + // given, and _find is the target. + // The same applies to USE, except if _selector is -1, then USE + // is being tried on an object in the scene without an inventory + // object being highlighted first. + + if ((_invMode == 2 || (_selector != -1 && _invMode == 3)) && _find >= 0) { + events._pressed = events._released = false; + _infoFlag = true; + clearInfo(); + + int temp = _selector; // Save the selector + _selector = -1; + + inv.putInv(1); + _selector = temp; // Restore it + temp = _invMode; + _invMode = -1; + inv.invCommands(true); + + _infoFlag = true; + clearInfo(); + banishWindow(false); + _key = -1; + + inv.freeInv(); + + if (_selector >= 0) + // Use/Give inv object with scene object + checkUseAction(scene._bgShapes[_find]._use[0], inv[_selector]._name, + _muse, _find, temp - 2); + else + // Now inv object has been highlighted + checkUseAction(scene._bgShapes[_find]._use[0], "*SELF", _muse, + _find, temp - 2); + + _selector = _oldSelector = -1; + } + } + } + } } /** @@ -1056,4 +1289,10 @@ void UserInterface::banishWindow(bool flag) { _menuMode = STD_MODE; } +void UserInterface::checkUseAction(UseType &use, const Common::String &invName, + const Common::String &msg, int objNum, int giveMode) { + // TODO +} + + } // End of namespace Sherlock diff --git a/engines/sherlock/user_interface.h b/engines/sherlock/user_interface.h index f6e0435f48..d94b2fadc5 100644 --- a/engines/sherlock/user_interface.h +++ b/engines/sherlock/user_interface.h @@ -26,6 +26,7 @@ #include "common/scummsys.h" #include "common/events.h" #include "sherlock/graphics.h" +#include "sherlock/objects.h" #include "sherlock/resources.h" namespace Sherlock { @@ -65,6 +66,7 @@ private: int _oldLook; bool _keyboardInput; int _invMode; + int _invIndex; bool _pause; int _cNum; int _selector, _oldSelector; @@ -73,6 +75,8 @@ private: Common::Rect _windowBounds; Common::String _descStr; int _windowStyle; + int _find; + Common::String _muse; private: void depressButton(int num); @@ -82,6 +86,8 @@ private: void toggleButton(int num); + void buttonPrint(const Common::Point &pt, int color, bool slamIt, const Common::String &str); + void examine(); void lookScreen(const Common::Point &pt); @@ -101,6 +107,9 @@ private: void doControls(); void makeButton(const Common::Rect &bounds, int textX, const Common::String &str); + + void checkUseAction(UseType &use, const Common::String &invName, const Common::String &msg, + int objNum, int giveMode); public: MenuMode _menuMode; int _menuCounter; |