diff options
-rw-r--r-- | data/graphics/gui/selection.png | bin | 246 -> 374 bytes | |||
-rw-r--r-- | src/gui/inventory.h | 6 | ||||
-rw-r--r-- | src/gui/itemcontainer.cpp | 75 |
3 files changed, 50 insertions, 31 deletions
diff --git a/data/graphics/gui/selection.png b/data/graphics/gui/selection.png Binary files differindex 3c4d5eb6..20f1ef68 100644 --- a/data/graphics/gui/selection.png +++ b/data/graphics/gui/selection.png diff --git a/src/gui/inventory.h b/src/gui/inventory.h index 969424fb..a035ee50 100644 --- a/src/gui/inventory.h +++ b/src/gui/inventory.h @@ -30,7 +30,6 @@ #include "itemcontainer.h" #include "gui.h" #include "window.h" -#include "scrollarea.h" /** * Inventory dialog. @@ -99,13 +98,12 @@ class InventoryWindow : public Window, gcn::ActionListener ItemContainer *items; private: - gcn::Button *useButton, *dropButton; - ScrollArea *invenScroll; - int useItem(int index, int id); void updateWidgets(); /** Updates widgets size/position */ void updateButtons(); /** Updates button states */ + gcn::Button *useButton, *dropButton; + gcn::ScrollArea *invenScroll; gcn::Label *itemNameLabel; gcn::Label *itemDescriptionLabel; gcn::Label *weightLabel; diff --git a/src/gui/itemcontainer.cpp b/src/gui/itemcontainer.cpp index d571f739..2cc6b8e2 100644 --- a/src/gui/itemcontainer.cpp +++ b/src/gui/itemcontainer.cpp @@ -31,7 +31,7 @@ ItemContainer::ItemContainer() ResourceManager *resman = ResourceManager::getInstance(); Image *itemImg = resman->getImage("graphics/sprites/items.png", IMG_ALPHA); if (!itemImg) logger->error("Unable to load items.png"); - itemset = new Spriteset(itemImg, 20, 20); + itemset = new Spriteset(itemImg, 32, 32); itemImg->decRef(); selImg = resman->getImage("graphics/gui/selection.png", IMG_ALPHA); @@ -57,45 +57,58 @@ ItemContainer::~ItemContainer() void ItemContainer::draw(gcn::Graphics* graphics) { - int x, y, w, h; + int gridWidth = itemset->spriteset[0]->getWidth() + 4; + int gridHeight = itemset->spriteset[0]->getHeight() + 10; + int w = getWidth(); + int columns = w / gridWidth; + int x, y; getAbsolutePosition(x, y); - w = getWidth(); - h = getHeight(); - int itemWidth = getWidth() / 24; - - if (items[selectedItem].quantity <= 0) { + // Reset selected item when quantity not above 0 (should probably be made + // sure somewhere else) + if (items[selectedItem].quantity <= 0) + { selectedItem = -1; } - if (selectedItem >= 0) { - int itemX = ((selectedItem - 2) % itemWidth) * 24; - int itemY = ((selectedItem - 2) / itemWidth) * 24; - - itemX -= itemX % 24; - selImg->draw(screen, x + itemX, y+itemY); - } + /* + * eAthena seems to start inventory from the 3rd slot. Still a mystery to + * us why, make sure not to copy this oddity to our own server. + */ + for (int i = 2; i < INVENTORY_SIZE; i++) + { + if (items[i].quantity > 0) + { + int itemX = ((i - 2) % columns) * gridWidth; + int itemY = ((i - 2) / columns) * gridHeight; - for (int i = 0; i < INVENTORY_SIZE; i++) { - int itemX = ((i - 2) % itemWidth) * 24; - int itemY = ((i - 2) / itemWidth) * 24; + // Draw selection image below selected item + if (selectedItem == i) + { + selImg->draw(screen, x + itemX, y + itemY); + } - itemX -= itemX % 24; - if (items[i].quantity > 0) { - if (itemDb->getItemInfo(items[i].id)->getImage() > 0) { + // Draw item icon + if (itemDb->getItemInfo(items[i].id)->getImage() > 0) + { itemset->spriteset[itemDb->getItemInfo( items[i].id)->getImage() - 1]->draw( screen, x + itemX, y + itemY); } + // Draw item caption std::stringstream ss; - if(!items[i].equipped) + + if (!items[i].equipped) { ss << items[i].quantity; - else + } + else { ss << "Eq."; + } + graphics->drawText(ss.str(), - itemX + 12, - itemY + 16, + itemX + gridWidth / 2, + itemY + gridHeight - 11, gcn::Graphics::CENTER); } } @@ -199,10 +212,18 @@ void ItemContainer::increaseQuantity(int index, int quantity) void ItemContainer::mousePress(int mx, int my, int button) { - if (button == gcn::MouseInput::LEFT) { - selectedItem = ((mx + 48) / 24) + ((my / 24) * (getWidth() / 24)); + int gridWidth = itemset->spriteset[0]->getWidth() + 4; + int gridHeight = itemset->spriteset[0]->getHeight() + 10; + int w = getWidth(); + int columns = w / gridWidth; + + if (button == gcn::MouseInput::LEFT) + { + selectedItem = mx / gridWidth + ((my / gridHeight) * columns) + 2; } - if (selectedItem > INVENTORY_SIZE) { + + if (selectedItem > INVENTORY_SIZE) + { selectedItem = INVENTORY_SIZE; } } |