]> git.localhorst.tv Git - l2e.git/blobdiff - src/menu/EquipMenu.cpp
implemented item equipping
[l2e.git] / src / menu / EquipMenu.cpp
index df924b18a024ade156e66fdc6784c2184665b9df..199b8e1265c7069a8d169118fb8ed05a4c438276 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,21 @@ 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)) {
+                       EquipSelected();
+                       inventoryMenu.SetInactive();
+                       equipmentMenu.SetActive();
+               } else if (input.JustPressed(Input::ACTION_B)) {
+                       inventoryMenu.SetInactive();
+                       equipmentMenu.SetActive();
+               }
        }
 }
 
@@ -149,16 +173,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 +252,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 +319,50 @@ 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));
+               }
+       }
+}
+
+void EquipMenu::EquipSelected() {
+       Inventory &inv = parent->Game().state->inventory;
+       Hero &hero = GetHero();
+       const Hero::EquipSlot slot = Hero::EquipSlot(equipmentMenu.SelectedIndex());
+
+       const Item *selected = inventoryMenu.Selected();
+       const Item *equipped = equipmentMenu.Selected();
+
+       if (!hero.CanEquip(*selected)) {
+               // TODO: error noise and blur
+               return;
+       }
+
+       inv.Remove(selected, 1);
+       if (!inv.Add(equipped, 1)) {
+               // roll back
+               inv.Add(selected, 1);
+               // TODO: error noise, blur, message?
+               return;
+       }
+
+       hero.SetEquipment(slot, selected);
+       LoadEquipment();
+       LoadInventory();
+}
+
 }