From 1516ba73671d59ab5d6e26602dbb1e5055cbb05c Mon Sep 17 00:00:00 2001 From: Littleboy Date: Fri, 29 Apr 2011 22:00:38 -0400 Subject: LASTEXPRESS: Implement skeleton code for selected item and inventory selection --- engines/lastexpress/game/inventory.cpp | 102 ++++++++++++++++++++++++++++++--- 1 file changed, 94 insertions(+), 8 deletions(-) (limited to 'engines/lastexpress/game/inventory.cpp') diff --git a/engines/lastexpress/game/inventory.cpp b/engines/lastexpress/game/inventory.cpp index 81189ae633..25db782c62 100644 --- a/engines/lastexpress/game/inventory.cpp +++ b/engines/lastexpress/game/inventory.cpp @@ -45,7 +45,7 @@ namespace LastExpress { Inventory::Inventory(LastExpressEngine *engine) : _engine(engine), _selectedItem(kItemNone), _highlightedItem(kItemNone), _itemsShown(0), _showingHourGlass(false), _blinkingEgg(false), _blinkingTime(0), _blinkingInterval(_defaultBlinkingInterval), _blinkingBrightness(1), - _useMagnifier(false), _flag1(false), _isOpened(false), _eggHightlighted(false), _itemScene(NULL) { + _useMagnifier(false), _portraitHighlighted(false), _isOpened(false), _eggHightlighted(false), _itemScene(NULL) { _inventoryRect = Common::Rect(0, 0, 32, 32); _menuRect = Common::Rect(608, 448, 640, 480); @@ -143,6 +143,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { drawItem((CursorStyle)(getMenu()->getGameId() + 39), 608, 448, 1); askForRedraw(); } + _eggHightlighted = false; } } else { @@ -159,7 +160,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { // If clicked, show the menu if (ev.type == Common::EVENT_LBUTTONDOWN) { _eggHightlighted = false; - _flag1 = false; + _portraitHighlighted = false; _isOpened = false; getSound()->playSoundWithSubtitles("LIB039.SND", SoundManager::kFlagMenuClock, kEntityPlayer); @@ -178,14 +179,95 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { // Selected item if (ev.mouse.x >= 32) { - // TODO + if (_isOpened) { + // If clicked + if (ev.type == Common::EVENT_LBUTTONDOWN) { + if (_highlightedItem != kItemNone) { + error("[Inventory::handleMouseEvent] Click on highlighted item not implemented"); + } + } else { + error("[Inventory::handleMouseEvent] Default handling of open menu not implemented"); + } + } else { + if (_portraitHighlighted) { + drawItem((CursorStyle)getProgress().portrait, 0, 0, 1); + askForRedraw(); + _portraitHighlighted = false; + } + + if (_selectedItem != kItemNone) { + error("[Inventory::handleMouseEvent] Default handling of selected item not implemented"); + } + } return; } // Opened inventory if (ev.mouse.y >= 32) { - // TODO + if (!_isOpened) { + if (_portraitHighlighted) { + drawItem((CursorStyle)getProgress().portrait, 0, 0, 1); + askForRedraw(); + _portraitHighlighted = false; + } + + return; + } + + if (ev.type == Common::EVENT_LBUTTONDOWN) { + error("[Inventory::handleMouseEvent] Click on open inventory item not implemented"); + + return; + } + + uint32 index = 0; + if (_highlightedItem != kItemNone) { + error("[Inventory::handleMouseEvent] Computing of open inventory clicked item not implemented"); + } + + drawItem((CursorStyle)getProgress().portrait, 0, 0, 1); + + // TODO clear items on inventory surface before redraw + + // Load the scene if an item has been selected + if (index) { + error("[Inventory::handleMouseEvent] Loading of item scene not implemented"); + + _isOpened = false; + + return; + } + + // Draw the selected item if any + if (!_selectedItem || get(_selectedItem)->manualSelect) { + _selectedItem = getFirstExaminableItem(); + + if (_selectedItem) { + drawItem(get(_selectedItem)->cursor, 44, 0); + } else { + clearSelectedItem(); + } + askForRedraw(); + } + + // Stop processing if we are not looking at an item already + if (!getState()->sceneUseBackup) { + _isOpened = false; + return; + } + + SceneIndex scene = kSceneNone; + if (getState()->sceneBackup2) { + scene = getState()->sceneBackup2; + getState()->sceneBackup2 = kSceneNone; + } else { + error("[Inventory::handleMouseEvent] Processing of item scene not implemented"); + } + + getScenes()->loadScene(scene); + + _isOpened = false; return; } @@ -202,9 +284,9 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { return; } - if (!_flag1 && !_isOpened) { + if (!_portraitHighlighted && !_isOpened) { drawItem((CursorStyle)getProgress().portrait, 0, 0); - _flag1 = true; + _portraitHighlighted = true; } else if (!_isOpened || (ev.type == Common::EVENT_LBUTTONDOWN || ev.type == Common::EVENT_LBUTTONUP)) { // Do nothing } else if (_isOpened) { @@ -239,7 +321,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { } } - _flag1 = true; + _portraitHighlighted = true; } // Draw highlighted item @@ -511,9 +593,13 @@ void Inventory::drawItem(CursorStyle id, uint16 x, uint16 y, int16 brightnessInd _engine->getGraphicsManager()->draw(&icon, GraphicsManager::kBackgroundInventory); } +void Inventory::clearSelectedItem() { + _engine->getGraphicsManager()->clear(GraphicsManager::kBackgroundInventory, Common::Rect(44, 0, 44 + 32, 32)); +} + // Close inventory: clear items and reset icon void Inventory::open() { - _flag1 = false; + _portraitHighlighted = false; _isOpened = true; // Draw highlighted portrait -- cgit v1.2.3 From 3088acf69a41dc0e942faad1b624fe097c690a3e Mon Sep 17 00:00:00 2001 From: Littleboy Date: Wed, 4 May 2011 10:10:46 -0400 Subject: LASTEXPRESS: Add button pressed state for inventory handling --- engines/lastexpress/game/inventory.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'engines/lastexpress/game/inventory.cpp') diff --git a/engines/lastexpress/game/inventory.cpp b/engines/lastexpress/game/inventory.cpp index 25db782c62..5df745d641 100644 --- a/engines/lastexpress/game/inventory.cpp +++ b/engines/lastexpress/game/inventory.cpp @@ -186,7 +186,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { error("[Inventory::handleMouseEvent] Click on highlighted item not implemented"); } } else { - error("[Inventory::handleMouseEvent] Default handling of open menu not implemented"); + warning("[Inventory::handleMouseEvent] Default handling of open menu not implemented"); } } else { if (_portraitHighlighted) { @@ -251,6 +251,8 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { askForRedraw(); } + return; + // Stop processing if we are not looking at an item already if (!getState()->sceneUseBackup) { _isOpened = false; @@ -287,7 +289,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { if (!_portraitHighlighted && !_isOpened) { drawItem((CursorStyle)getProgress().portrait, 0, 0); _portraitHighlighted = true; - } else if (!_isOpened || (ev.type == Common::EVENT_LBUTTONDOWN || ev.type == Common::EVENT_LBUTTONUP)) { + } else if (!_isOpened || getFlags()->mouseLeftPressed) { // Do nothing } else if (_isOpened) { close(); -- cgit v1.2.3 From 8d4622d70dc6f9d6b2788c849a0dfb0beb2ecc96 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Wed, 4 May 2011 10:12:14 -0400 Subject: LASTEXPRESS: Draw portrait non-highlighted in Inventory::show() --- engines/lastexpress/game/inventory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'engines/lastexpress/game/inventory.cpp') diff --git a/engines/lastexpress/game/inventory.cpp b/engines/lastexpress/game/inventory.cpp index 5df745d641..a8a6556626 100644 --- a/engines/lastexpress/game/inventory.cpp +++ b/engines/lastexpress/game/inventory.cpp @@ -340,7 +340,7 @@ void Inventory::show() { askForRedraw(); // Show portrait (first draw, cannot be highlighted) - drawItem((CursorStyle)getProgress().portrait, 0, 0); + drawItem((CursorStyle)getProgress().portrait, 0, 0, 1); // Show selected item if (_selectedItem != kItemNone) @@ -599,7 +599,7 @@ void Inventory::clearSelectedItem() { _engine->getGraphicsManager()->clear(GraphicsManager::kBackgroundInventory, Common::Rect(44, 0, 44 + 32, 32)); } -// Close inventory: clear items and reset icon +// Open inventory: show portrait selected and draw contents void Inventory::open() { _portraitHighlighted = false; _isOpened = true; -- cgit v1.2.3 From 2bc865f01af8733e8411eb4b50bfb0d3b29dd2a5 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Tue, 10 May 2011 18:19:01 -0400 Subject: LASTEXPRESS: Implement highlight of inventory items --- engines/lastexpress/game/inventory.cpp | 40 ++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 16 deletions(-) (limited to 'engines/lastexpress/game/inventory.cpp') diff --git a/engines/lastexpress/game/inventory.cpp b/engines/lastexpress/game/inventory.cpp index a8a6556626..05348fb5a4 100644 --- a/engines/lastexpress/game/inventory.cpp +++ b/engines/lastexpress/game/inventory.cpp @@ -43,13 +43,13 @@ namespace LastExpress { -Inventory::Inventory(LastExpressEngine *engine) : _engine(engine), _selectedItem(kItemNone), _highlightedItem(kItemNone), _itemsShown(0), +Inventory::Inventory(LastExpressEngine *engine) : _engine(engine), _selectedItem(kItemNone), _highlightedItemIndex(0), _itemsShown(0), _showingHourGlass(false), _blinkingEgg(false), _blinkingTime(0), _blinkingInterval(_defaultBlinkingInterval), _blinkingBrightness(1), _useMagnifier(false), _portraitHighlighted(false), _isOpened(false), _eggHightlighted(false), _itemScene(NULL) { - _inventoryRect = Common::Rect(0, 0, 32, 32); - _menuRect = Common::Rect(608, 448, 640, 480); - _selectedRect = Common::Rect(44, 0, 76, 32); + //_inventoryRect = Common::Rect(0, 0, 32, 32); + _menuEggRect = Common::Rect(608, 448, 640, 480); + //_selectedItemRect = Common::Rect(44, 0, 76, 32); init(); } @@ -136,7 +136,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { _useMagnifier = false; // Egg (menu) - if (!_menuRect.contains(ev.mouse)) { + if (!_menuEggRect.contains(ev.mouse)) { // Remove highlight if needed if (_eggHightlighted) { if (!getGlobalTimer()) { @@ -182,7 +182,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { if (_isOpened) { // If clicked if (ev.type == Common::EVENT_LBUTTONDOWN) { - if (_highlightedItem != kItemNone) { + if (_highlightedItemIndex != 0) { error("[Inventory::handleMouseEvent] Click on highlighted item not implemented"); } } else { @@ -215,14 +215,21 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { return; } - if (ev.type == Common::EVENT_LBUTTONDOWN) { - error("[Inventory::handleMouseEvent] Click on open inventory item not implemented"); + // Change highlights on item list + if (getFlags()->mouseLeftPressed) { + uint32 index = ev.mouse.y / 40; + + if (_highlightedItemIndex && _highlightedItemIndex != index) + drawHighlight(_highlightedItemIndex, true); + + if (index && index <= _itemsShown && index != _highlightedItemIndex) + drawHighlight(index, false); return; } uint32 index = 0; - if (_highlightedItem != kItemNone) { + if (_highlightedItemIndex) { error("[Inventory::handleMouseEvent] Computing of open inventory clicked item not implemented"); } @@ -327,8 +334,8 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { } // Draw highlighted item - if (_highlightedItem) - drawHighlight(); + if (_highlightedItemIndex) + drawHighlight(_highlightedItemIndex, true); } } @@ -640,8 +647,8 @@ void Inventory::close() { askForRedraw(); } -void Inventory::drawHighlight() { - int32 count = 0; +void Inventory::drawHighlight(uint32 currentIndex, bool reset) { + uint32 count = 0; uint32 index = 0; for (uint32 i = 1; i < ARRAYSIZE(_entries); i++) { @@ -653,7 +660,7 @@ void Inventory::drawHighlight() { if (count < 11) { ++count; - if (count == _highlightedItem) { + if (count == currentIndex) { index = i; break; } @@ -661,8 +668,9 @@ void Inventory::drawHighlight() { } if (index) { - drawItem(_entries[index].cursor, 0, 40 * _highlightedItem + 4, 1); - _highlightedItem = kItemNone; + drawItem(_entries[index].cursor, 0, 40 * currentIndex + 4, reset ? 1 : -1); + _highlightedItemIndex = reset ? 0 : currentIndex; + askForRedraw(); } } -- cgit v1.2.3 From 33c3e19cea2a08fbf26ecbe940763e8ee1c37d28 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Tue, 10 May 2011 18:59:21 -0400 Subject: LASTEXPRESS: Implement item selection and scene loading --- engines/lastexpress/game/inventory.cpp | 107 ++++++++++++++++++++++----------- 1 file changed, 73 insertions(+), 34 deletions(-) (limited to 'engines/lastexpress/game/inventory.cpp') diff --git a/engines/lastexpress/game/inventory.cpp b/engines/lastexpress/game/inventory.cpp index 05348fb5a4..c4d43d53d7 100644 --- a/engines/lastexpress/game/inventory.cpp +++ b/engines/lastexpress/game/inventory.cpp @@ -49,7 +49,7 @@ Inventory::Inventory(LastExpressEngine *engine) : _engine(engine), _selectedItem //_inventoryRect = Common::Rect(0, 0, 32, 32); _menuEggRect = Common::Rect(608, 448, 640, 480); - //_selectedItemRect = Common::Rect(44, 0, 76, 32); + _selectedItemRect = Common::Rect(44, 0, 76, 32); init(); } @@ -195,7 +195,9 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { _portraitHighlighted = false; } - if (_selectedItem != kItemNone) { + if (_selectedItem != kItemNone + && get(_selectedItem)->scene != kSceneNone + && _selectedItemRect.contains(ev.mouse)) { error("[Inventory::handleMouseEvent] Default handling of selected item not implemented"); } } @@ -205,6 +207,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { // Opened inventory if (ev.mouse.y >= 32) { + // Draw portrait (darkened) if the inventory is closed (and we are not on top of it) if (!_isOpened) { if (_portraitHighlighted) { drawItem((CursorStyle)getProgress().portrait, 0, 0, 1); @@ -215,7 +218,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { return; } - // Change highlights on item list + // Change item highlight on list if (getFlags()->mouseLeftPressed) { uint32 index = ev.mouse.y / 40; @@ -228,37 +231,46 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { return; } - uint32 index = 0; - if (_highlightedItemIndex) { - error("[Inventory::handleMouseEvent] Computing of open inventory clicked item not implemented"); - } + // User released the mouse button, check if we were on a valid item + uint32 index = _highlightedItemIndex ? getItemIndex(_highlightedItemIndex) : 0; + // Reset items and portrait drawItem((CursorStyle)getProgress().portrait, 0, 0, 1); - - // TODO clear items on inventory surface before redraw + _engine->getGraphicsManager()->clear(GraphicsManager::kBackgroundInventory, Common::Rect(0, 44, 32, (int16)(40 * _itemsShown + 40))); + _highlightedItemIndex = 0; + _itemsShown = 0; // Load the scene if an item has been selected if (index) { - error("[Inventory::handleMouseEvent] Loading of item scene not implemented"); - - _isOpened = false; - - return; - } + InventoryEntry entry = _entries[index]; + + // If a scene is affected to the item + if (entry.scene) { + if (getState()->sceneUseBackup) { + if (getFirstExaminableItem() && !getState()->sceneBackup2) + getState()->sceneBackup2 = getState()->scene; + } else { + getState()->sceneUseBackup = true; + getState()->sceneBackup = getState()->scene; + } - // Draw the selected item if any - if (!_selectedItem || get(_selectedItem)->manualSelect) { - _selectedItem = getFirstExaminableItem(); + getScenes()->loadScene(entry.scene); + } - if (_selectedItem) { - drawItem(get(_selectedItem)->cursor, 44, 0); + if (entry.field_2) { + selectItem((InventoryItem)index); } else { - clearSelectedItem(); + drawSelectedItem(); } - askForRedraw(); + + // Set inventory as closed (will cause a cleanup on next call) + _isOpened = false; + + return; } - return; + // Draw the currently selected item + drawSelectedItem(); // Stop processing if we are not looking at an item already if (!getState()->sceneUseBackup) { @@ -271,7 +283,16 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { scene = getState()->sceneBackup2; getState()->sceneBackup2 = kSceneNone; } else { - error("[Inventory::handleMouseEvent] Processing of item scene not implemented"); + if (getEvent(kEventKronosBringFirebird) || getProgress().isEggOpen) { + _isOpened = false; + return; + } + + getState()->sceneUseBackup = false; + scene = getState()->sceneBackup; + + if (getEntities()->getPosition(getScenes()->get(scene)->car, getScenes()->get(scene)->position)) + scene = getScenes()->processIndex(getState()->sceneBackup); } getScenes()->loadScene(scene); @@ -602,6 +623,20 @@ void Inventory::drawItem(CursorStyle id, uint16 x, uint16 y, int16 brightnessInd _engine->getGraphicsManager()->draw(&icon, GraphicsManager::kBackgroundInventory); } +void Inventory::drawSelectedItem() { + // Draw the selected item if any + if (!_selectedItem || get(_selectedItem)->manualSelect) { + _selectedItem = getFirstExaminableItem(); + + if (_selectedItem) { + drawItem(get(_selectedItem)->cursor, 44, 0); + } else { + clearSelectedItem(); + } + askForRedraw(); + } +} + void Inventory::clearSelectedItem() { _engine->getGraphicsManager()->clear(GraphicsManager::kBackgroundInventory, Common::Rect(44, 0, 44 + 32, 32)); } @@ -648,8 +683,17 @@ void Inventory::close() { } void Inventory::drawHighlight(uint32 currentIndex, bool reset) { + uint32 index = getItemIndex(currentIndex); + + if (index) { + drawItem(_entries[index].cursor, 0, 40 * currentIndex + 4, reset ? 1 : -1); + _highlightedItemIndex = reset ? 0 : currentIndex; + askForRedraw(); + } +} + +uint32 Inventory::getItemIndex(uint32 currentIndex) { uint32 count = 0; - uint32 index = 0; for (uint32 i = 1; i < ARRAYSIZE(_entries); i++) { if (!_entries[i].isPresent) @@ -660,18 +704,13 @@ void Inventory::drawHighlight(uint32 currentIndex, bool reset) { if (count < 11) { ++count; - if (count == currentIndex) { - index = i; - break; - } + + if (count == currentIndex) + return i; } } - if (index) { - drawItem(_entries[index].cursor, 0, 40 * currentIndex + 4, reset ? 1 : -1); - _highlightedItemIndex = reset ? 0 : currentIndex; - askForRedraw(); - } + return 0; } } // End of namespace LastExpress -- cgit v1.2.3