diff options
author | Julien Templier | 2011-02-09 00:24:06 +0000 |
---|---|---|
committer | Julien Templier | 2011-02-09 00:24:06 +0000 |
commit | 058d75b70810965a508fa5d56d449fed242a6cf8 (patch) | |
tree | bf31a58dc80aff68848f237f87aebcd629de8761 /engines | |
parent | 0250fd45712d134b3e16ed334b980b9f623bf79d (diff) | |
download | scummvm-rg350-058d75b70810965a508fa5d56d449fed242a6cf8.tar.gz scummvm-rg350-058d75b70810965a508fa5d56d449fed242a6cf8.tar.bz2 scummvm-rg350-058d75b70810965a508fa5d56d449fed242a6cf8.zip |
LASTEXPRESS: Implement proper Inventory::open() and Inventory::close()
svn-id: r55848
Diffstat (limited to 'engines')
-rw-r--r-- | engines/lastexpress/game/inventory.cpp | 267 | ||||
-rw-r--r-- | engines/lastexpress/game/inventory.h | 8 | ||||
-rw-r--r-- | engines/lastexpress/game/logic.cpp | 24 |
3 files changed, 173 insertions, 126 deletions
diff --git a/engines/lastexpress/game/inventory.cpp b/engines/lastexpress/game/inventory.cpp index 6b78d879ed..bce327baa1 100644 --- a/engines/lastexpress/game/inventory.cpp +++ b/engines/lastexpress/game/inventory.cpp @@ -43,9 +43,9 @@ namespace LastExpress { -Inventory::Inventory(LastExpressEngine *engine) : _engine(engine), _selectedItem(kItemNone), _highlightedItem(kItemNone), _opened(false), _visible(false), +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), _flag2(false), _eggHightlighted(false), _itemScene(NULL) { + _useMagnifier(false), _flag1(false), _isOpened(false), _eggHightlighted(false), _itemScene(NULL) { _inventoryRect = Common::Rect(0, 0, 32, 32); _menuRect = Common::Rect(608, 448, 640, 480); @@ -160,11 +160,12 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { if (ev.type == Common::EVENT_LBUTTONDOWN) { _eggHightlighted = false; _flag1 = false; - _flag2 = false; + _isOpened = false; getSound()->playSoundWithSubtitles("LIB039.SND", SoundManager::kFlagMenuClock, kEntityPlayer); getMenu()->show(true, kSavegameTypeIndex, 0); + } else if (ev.type == Common::EVENT_RBUTTONDOWN) { if (getGlobalTimer()) { if (getSound()->isBuffered("TIMER")) @@ -175,6 +176,51 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { } } + // Selected item + if (ev.mouse.x >= 32) { + // TODO + + return; + } + + // Opened inventory + if (ev.mouse.y >= 32) { + // TODO + + return; + } + + // + if (!getProgress().field_84 + && getEntityData(kEntityPlayer)->location != kLocationOutsideTrain + && getProgress().field_18 != 4 + && (_selectedItem == kItemNone || get(_selectedItem)->manualSelect || getState()->sceneUseBackup)) { + + // Draw inventory contents when clicking on portrait + if (ev.type == Common::EVENT_LBUTTONDOWN) { + open(); + return; + } + + if (!_flag1 && !_isOpened) { + drawItem((CursorStyle)getProgress().portrait, 0, 0); + _flag1 = true; + } else if (!_isOpened || (ev.type == Common::EVENT_LBUTTONDOWN || ev.type == Common::EVENT_LBUTTONUP)) { + // Do nothing + } else if (_isOpened) { + close(); + + // Select item + + // Examine item + + _flag1 = true; + } + + // Draw highlighted item + } + + // //// If clicked, show the menu //if (ev.type == Common::EVENT_LBUTTONUP) { @@ -193,104 +239,104 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { // } //} - // Portrait (inventory) - if (_inventoryRect.contains(ev.mouse)) { - //insideInventory = true; - _engine->getCursor()->setStyle(kCursorNormal); - - // If clicked, show pressed state and display inventory - if (ev.type == Common::EVENT_LBUTTONUP) { - open(); - } else { - // Highlight if needed - if (_highlightedItem != (InventoryItem)getProgress().portrait && !_opened) { - _highlightedItem = (InventoryItem)getProgress().portrait; - drawItem((CursorStyle)getProgress().portrait, 0, 0); - - askForRedraw(); - } - } - } else { - // remove highlight if needed - if (_highlightedItem == (InventoryItem)getProgress().portrait && !_opened) { - drawItem((CursorStyle)getProgress().portrait, 0, 0); - _highlightedItem = kItemNone; - askForRedraw(); - } - } - - // If the inventory is open, check all items rect to see if we need to highlight one / handle click - if (_opened) { - - // Always show normal cursor when the inventory is opened - //insideInventory = true; - _engine->getCursor()->setStyle(kCursorNormal); - - bool selected = false; - - // Iterate over items - int16 y = 44; - for (int i = 1; i < 32; i++) { - if (!hasItem((InventoryItem)i)) - continue; - - if (Common::Rect(0, y, 32, 32 + y).contains(ev.mouse)) { - - // If released with an item highlighted, show this item - if (ev.type == Common::EVENT_LBUTTONUP) { - if (_entries[i].isSelectable) { - selected = true; - _selectedItem = (InventoryItem)i; - drawItem(get(_selectedItem)->cursor, 44, 0); - } - - examine((InventoryItem)i); - break; - } else { - if (_highlightedItem != i) { - drawItem(_entries[i].cursor, 0, y); - _highlightedItem = (InventoryItem)i; - askForRedraw(); - } - } - } else { - // Remove highlight if necessary - if (_highlightedItem == i) { - drawItem(_entries[i].cursor, 0, y); - _highlightedItem = kItemNone; - askForRedraw(); - } - } + //// Portrait (inventory) + //if (_inventoryRect.contains(ev.mouse)) { + // //insideInventory = true; + // _engine->getCursor()->setStyle(kCursorNormal); + + // // If clicked, show pressed state and display inventory + // if (ev.type == Common::EVENT_LBUTTONUP) { + // open(); + // } else { + // // Highlight if needed + // if (_highlightedItem != (InventoryItem)getProgress().portrait && !_opened) { + // _highlightedItem = (InventoryItem)getProgress().portrait; + // drawItem((CursorStyle)getProgress().portrait, 0, 0); + + // askForRedraw(); + // } + // } + //} else { + // // remove highlight if needed + // if (_highlightedItem == (InventoryItem)getProgress().portrait && !_opened) { + // drawItem((CursorStyle)getProgress().portrait, 0, 0); + // _highlightedItem = kItemNone; + // askForRedraw(); + // } + //} - y += 40; - } + //// If the inventory is open, check all items rect to see if we need to highlight one / handle click + //if (_opened) { + + // // Always show normal cursor when the inventory is opened + // //insideInventory = true; + // _engine->getCursor()->setStyle(kCursorNormal); + + // bool selected = false; + + // // Iterate over items + // int16 y = 44; + // for (int i = 1; i < 32; i++) { + // if (!hasItem((InventoryItem)i)) + // continue; + + // if (Common::Rect(0, y, 32, 32 + y).contains(ev.mouse)) { + + // // If released with an item highlighted, show this item + // if (ev.type == Common::EVENT_LBUTTONUP) { + // if (_entries[i].isSelectable) { + // selected = true; + // _selectedItem = (InventoryItem)i; + // drawItem(get(_selectedItem)->cursor, 44, 0); + // } + + // examine((InventoryItem)i); + // break; + // } else { + // if (_highlightedItem != i) { + // drawItem(_entries[i].cursor, 0, y); + // _highlightedItem = (InventoryItem)i; + // askForRedraw(); + // } + // } + // } else { + // // Remove highlight if necessary + // if (_highlightedItem == i) { + // drawItem(_entries[i].cursor, 0, y); + // _highlightedItem = kItemNone; + // askForRedraw(); + // } + // } + + // y += 40; + // } - // Right button is released: we need to close the inventory - if (ev.type == Common::EVENT_LBUTTONUP) { + // // Right button is released: we need to close the inventory + // if (ev.type == Common::EVENT_LBUTTONUP) { - // Not on a selectable item: unselect the current item - if (!selected) - unselectItem(); + // // Not on a selectable item: unselect the current item + // if (!selected) + // unselectItem(); - close(); - } - } + // close(); + // } + //} - // Selected item - if (_selectedItem != kItemNone && _selectedRect.contains(ev.mouse)) { - //insideInventory = true; + //// Selected item + //if (_selectedItem != kItemNone && _selectedRect.contains(ev.mouse)) { + // //insideInventory = true; - // Show magnifier icon - _engine->getCursor()->setStyle(kCursorMagnifier); + // // Show magnifier icon + // _engine->getCursor()->setStyle(kCursorMagnifier); - if (ev.type == Common::EVENT_LBUTTONUP) { - examine(_selectedItem); - } - } + // if (ev.type == Common::EVENT_LBUTTONUP) { + // examine(_selectedItem); + // } + //} - // If the egg is blinking, refresh - if (_blinkingEgg) - drawEgg(); + //// If the egg is blinking, refresh + //if (_blinkingEgg) + // drawEgg(); // Restore cursor //if (!insideInventory) @@ -581,18 +627,24 @@ void Inventory::drawItem(CursorStyle id, uint16 x, uint16 y, uint16 brightnessIn // Close inventory: clear items and reset icon void Inventory::open() { - _opened = true; + _flag1 = false; + _isOpened = true; - // Show selected state + // Draw highlighted portrait drawItem((CursorStyle)(getProgress().portrait + 1), 0, 0); - uint16 y = 44; + // Draw at most 11 items in the inventory + _itemsShown = 0; + for (int i = 1; i < ARRAYSIZE(_entries); i++) { + if (!_entries[i].isPresent) + continue; - // Iterate over items - for (uint i = 1; i < 32; i++) { - if (_entries[i].isPresent) { - drawItem(_entries[i].cursor, 0, y); - y += 40; + if (!_entries[i].manualSelect) + continue; + + if (_itemsShown < 11) { + drawItem(_entries[i].cursor, 0, 40 * _itemsShown + 44, 1); + ++_itemsShown; } } @@ -601,20 +653,15 @@ void Inventory::open() { // Close inventory: clear items and reset icon void Inventory::close() { - _opened = false; + _isOpened = false; // Fallback to unselected state drawItem((CursorStyle)getProgress().portrait, 0, 0); - // Erase rectangle for all inventory items - int count = 0; - for (uint i = 1; i < 32; i++) { - if (_entries[i].isPresent) { - count++; - } - } + // Erase rectangle for inventory items shown + _engine->getGraphicsManager()->clear(GraphicsManager::kBackgroundInventory, Common::Rect(0, 44, 32, (int16)(44 + 40 * _itemsShown))); - _engine->getGraphicsManager()->clear(GraphicsManager::kBackgroundInventory, Common::Rect(0, 44, 32, (int16)(44 + 44 * count))); + _itemsShown = 0; askForRedraw(); } diff --git a/engines/lastexpress/game/inventory.h b/engines/lastexpress/game/inventory.h index 4f8a7dd806..f1aed8069a 100644 --- a/engines/lastexpress/game/inventory.h +++ b/engines/lastexpress/game/inventory.h @@ -121,7 +121,7 @@ public: // State bool isMagnifierInUse() { return _useMagnifier; } bool isFlag1() { return _flag1; } - bool isFlag2() { return _flag2; } + bool isOpened() { return _isOpened; } bool isEggHighlighted() { return _eggHightlighted; } // Serializable @@ -143,8 +143,8 @@ private: InventoryEntry _entries[32]; InventoryItem _selectedItem; InventoryItem _highlightedItem; - bool _opened; - bool _visible; + + uint32 _itemsShown; bool _showingHourGlass; bool _blinkingEgg; @@ -155,7 +155,7 @@ private: // Flags bool _useMagnifier; bool _flag1; - bool _flag2; + bool _isOpened; bool _eggHightlighted; Scene *_itemScene; diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp index b300586813..bfed65eb4a 100644 --- a/engines/lastexpress/game/logic.cpp +++ b/engines/lastexpress/game/logic.cpp @@ -90,7 +90,7 @@ Logic::~Logic() { if (getInventory()->isMagnifierInUse()) \ _engine->getCursor()->setStyle(kCursorMagnifier); \ if (getInventory()->isFlag1() \ - || getInventory()->isFlag2() \ + || getInventory()->isOpened() \ || getInventory()->isEggHighlighted()) \ _engine->getCursor()->setStyle(kCursorNormal); \ return; \ @@ -144,7 +144,7 @@ void Logic::eventMouse(const Common::Event &ev) { && !getEntities()->isPlayerPosition(kCarGreenSleeping, 59) && !getEntities()->isPlayerPosition(kCarGreenSleeping, 76) && !getInventory()->isFlag1() - && !getInventory()->isFlag2() + && !getInventory()->isOpened() && !getInventory()->isEggHighlighted() && !getInventory()->isMagnifierInUse()) { @@ -174,7 +174,7 @@ void Logic::eventMouse(const Common::Event &ev) { && (getEntities()->isPlayerInCar(kCarGreenSleeping) || getEntities()->isPlayerInCar(kCarRedSleeping)) && getProgress().jacket == kJacketGreen && !getInventory()->isFlag1() - && !getInventory()->isFlag2() + && !getInventory()->isOpened() && !getInventory()->isEggHighlighted() && !getInventory()->isMagnifierInUse() && (getInventory()->get(kItem2)->location == kObjectLocationNone || getEntityData(kEntityPlayer)->car != kCarRedSleeping || getEntityData(kEntityPlayer)->entityPosition != kPosition_2300)) { @@ -199,7 +199,7 @@ void Logic::eventMouse(const Common::Event &ev) { EntityIndex entityIndex = getEntities()->canInteractWith(ev.mouse); if (entityIndex && !getInventory()->isFlag1() - && !getInventory()->isFlag2() + && !getInventory()->isOpened() && !getInventory()->isEggHighlighted() && !getInventory()->isMagnifierInUse()) { @@ -223,10 +223,10 @@ void Logic::eventMouse(const Common::Event &ev) { ////////////////////////////////////////////////////////////////////////// // Handle standard actions - if (getInventory()->isFlag1() || getInventory()->isFlag2() || getInventory()->isEggHighlighted()) + if (getInventory()->isFlag1() || getInventory()->isOpened() || getInventory()->isEggHighlighted()) _engine->getCursor()->setStyle(kCursorNormal); - if (hotspotHandled || getInventory()->isFlag1() || getInventory()->isFlag2() || getInventory()->isEggHighlighted()) + if (hotspotHandled || getInventory()->isFlag1() || getInventory()->isOpened() || getInventory()->isEggHighlighted()) return; // Magnifier in use @@ -234,7 +234,7 @@ void Logic::eventMouse(const Common::Event &ev) { _engine->getCursor()->setStyle(kCursorMagnifier); if (getInventory()->isFlag1() - || getInventory()->isFlag2() + || getInventory()->isOpened() || getInventory()->isEggHighlighted()) _engine->getCursor()->setStyle(kCursorNormal); @@ -519,7 +519,7 @@ void Logic::updateCursor(bool) const { /* the cursor is always updated, even whe || getEntities()->isPlayerPosition(kCarGreenSleeping, 59) || getEntities()->isPlayerPosition(kCarGreenSleeping, 76) || getInventory()->isFlag1() - || getInventory()->isFlag2() + || getInventory()->isOpened() || getInventory()->isEggHighlighted() || getInventory()->isMagnifierInUse()) { @@ -527,7 +527,7 @@ void Logic::updateCursor(bool) const { /* the cursor is always updated, even whe || (!getEntities()->isPlayerInCar(kCarGreenSleeping) && !getEntities()->isPlayerInCar(kCarRedSleeping)) || getProgress().jacket != kJacketGreen || getInventory()->isFlag1() - || getInventory()->isFlag2() + || getInventory()->isOpened() || getInventory()->isEggHighlighted() || getInventory()->isMagnifierInUse() || (getInventory()->get(kItem2)->location @@ -537,7 +537,7 @@ void Logic::updateCursor(bool) const { /* the cursor is always updated, even whe EntityIndex entity = getEntities()->canInteractWith(getCoords()); if (entity && !getInventory()->isFlag1() - && !getInventory()->isFlag2() + && !getInventory()->isOpened() && !getInventory()->isEggHighlighted() && !getInventory()->isMagnifierInUse()) { if (getInventory()->hasItem((InventoryItem)(getEntityData(entity)->inventoryItem & kItemToggleHigh))) { @@ -551,7 +551,7 @@ void Logic::updateCursor(bool) const { /* the cursor is always updated, even whe if (!interact && !getInventory()->isFlag1() - && !getInventory()->isFlag2() + && !getInventory()->isOpened() && !getInventory()->isEggHighlighted() && !getInventory()->isMagnifierInUse()) { int location = 0; @@ -587,7 +587,7 @@ void Logic::updateCursor(bool) const { /* the cursor is always updated, even whe if (getInventory()->isMagnifierInUse()) style = kCursorMagnifier; - if (getInventory()->isFlag1() || getInventory()->isFlag2() || getInventory()->isEggHighlighted()) + if (getInventory()->isFlag1() || getInventory()->isOpened() || getInventory()->isEggHighlighted()) style = kCursorNormal; _engine->getCursor()->setStyle(style); |