]> git.localhorst.tv Git - l2e.git/blobdiff - src/menu/EquipMenu.cpp
added inventory menu to EquipMenu
[l2e.git] / src / menu / EquipMenu.cpp
index df924b18a024ade156e66fdc6784c2184665b9df..c60ea30a92795cb56fc85861b5ca95f03bd7f8ab 100644 (file)
@@ -50,6 +50,7 @@ EquipMenu::EquipMenu(PartyMenu *parent, int cursor)
 
 void EquipMenu::OnEnterState(SDL_Surface *) {
        equipmentMenu.SetInactive();
+       inventoryMenu.SetInactive();
 }
 
 void EquipMenu::OnExitState(SDL_Surface *) {
@@ -81,6 +82,7 @@ void EquipMenu::HandleEvents(const Input &input) {
                if (input.JustPressed(Input::ACTION_A)) {
                        switch (actionMenu.Selected()) {
                                case CHOICE_EQUIP:
+                                       LoadEquipment();
                                        actionMenu.SetSelected();
                                        equipmentMenu.SetActive();
                                        break;
@@ -105,9 +107,15 @@ void EquipMenu::HandleEvents(const Input &input) {
        } else if (equipmentMenu.IsActive()) {
                if (input.JustPressed(Input::PAD_UP)) {
                        equipmentMenu.PreviousRow();
+                       if (InventoryVisible()) {
+                               LoadInventory();
+                       }
                }
                if (input.JustPressed(Input::PAD_DOWN)) {
                        equipmentMenu.NextRow();
+                       if (InventoryVisible()) {
+                               LoadInventory();
+                       }
                }
                if (input.JustPressed(Input::ACTION_B)) {
                        equipmentMenu.SetInactive();
@@ -115,7 +123,8 @@ void EquipMenu::HandleEvents(const Input &input) {
                } else if (input.JustPressed(Input::ACTION_A)) {
                        switch (actionMenu.Selected()) {
                                case CHOICE_EQUIP:
-                                       // TODO
+                                       equipmentMenu.SetSelected();
+                                       inventoryMenu.SetActive();
                                        break;
                                case CHOICE_STRONGEST:
                                case CHOICE_REMOVE_ALL:
@@ -131,6 +140,19 @@ void EquipMenu::HandleEvents(const Input &input) {
                                        break;
                        }
                }
+       } else {
+               if (input.JustPressed(Input::PAD_UP)) {
+                       inventoryMenu.PreviousRow();
+               }
+               if (input.JustPressed(Input::PAD_DOWN)) {
+                       inventoryMenu.NextRow();
+               }
+               if (input.JustPressed(Input::ACTION_A)) {
+                       // TODO: equip selected item
+               } else if (input.JustPressed(Input::ACTION_B)) {
+                       inventoryMenu.SetInactive();
+                       equipmentMenu.SetActive();
+               }
        }
 }
 
@@ -149,16 +171,23 @@ void EquipMenu::Render(SDL_Surface *screen) {
        Vector<int> equipOffset(
                        17 * parent->Res().statusFont->CharWidth(),
                        4 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8);
-       Vector<int> menuOffset(
-                       15 * parent->Res().statusFont->CharWidth(),
-                       17 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8);
 
        parent->RenderBackground(screen);
        parent->Res().shoulderNav->Draw(screen, offset + shoulderNavOffset);
        RenderStatus(screen, offset + parent->StatusOffset(0));
        RenderStats(screen, offset + statsOffset);
        RenderEquipmentMenu(screen, offset + equipOffset);
-       RenderActionMenu(screen, offset + menuOffset);
+       if (InventoryVisible()) {
+               Vector<int> inventoryOffset(
+                               parent->Res().statusFont->CharWidth(),
+                               17 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8);
+               RenderInventoryMenu(screen, offset + inventoryOffset);
+       } else {
+               Vector<int> menuOffset(
+                               15 * parent->Res().statusFont->CharWidth(),
+                               17 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8);
+               RenderActionMenu(screen, offset + menuOffset);
+       }
 }
 
 int EquipMenu::Width() const {
@@ -221,7 +250,12 @@ void EquipMenu::RenderActionMenu(SDL_Surface *screen, const Vector<int> &offset)
 }
 
 void EquipMenu::RenderInventoryMenu(SDL_Surface *screen, const Vector<int> &offset) const {
+       const Font &font(*parent->Res().normalFont);
+       const Frame &frame(*parent->Res().statusFrame);
+       const Vector<int> menuOffset(3 * font.CharWidth(), font.CharHeight() + font.CharHeight() / 4);
 
+       frame.Draw(screen, offset, 30 * font.CharWidth(), 11 * font.CharHeight());
+       inventoryMenu.Draw(screen, offset + menuOffset);
 }
 
 
@@ -283,4 +317,24 @@ void EquipMenu::DropItem() {
        LoadEquipment();
 }
 
+
+bool EquipMenu::InventoryVisible() const {
+       return !actionMenu.IsActive() && actionMenu.Selected() == CHOICE_EQUIP;
+}
+
+void EquipMenu::LoadInventory() {
+       const Inventory &inv = parent->Game().state->inventory;
+       const Hero &hero = GetHero();
+       const Hero::EquipSlot slot = Hero::EquipSlot(equipmentMenu.SelectedIndex());
+
+       inventoryMenu.Clear();
+       for (int i = 0; i < inv.MaxItems(); ++i) {
+               const Item *item = inv.ItemAt(i);
+               if (item && item->EquipableAt(slot)) {
+                       inventoryMenu.Add(item->Name(), item, hero.CanEquip(*item),
+                                       item->MenuIcon(), inv.ItemCountAt(i));
+               }
+       }
+}
+
 }