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;  | 
