]> git.localhorst.tv Git - l2e.git/blobdiff - src/menu/EquipMenu.cpp
removed stupid file headers that eclipse put in
[l2e.git] / src / menu / EquipMenu.cpp
index 30cc1798a70c9b55dca4f20ea3fa1ba1a74c24b4..86e8cdbc8b5f5321a369818b7306ec1658a834e0 100644 (file)
@@ -1,10 +1,3 @@
-/*
- * EquipMenu.cpp
- *
- *  Created on: Nov 18, 2012
- *      Author: holy
- */
-
 #include "EquipMenu.h"
 
 #include "HeroStatus.h"
@@ -50,6 +43,7 @@ EquipMenu::EquipMenu(PartyMenu *parent, int cursor)
 
 void EquipMenu::OnEnterState(SDL_Surface *) {
        equipmentMenu.SetInactive();
+       inventoryMenu.SetInactive();
 }
 
 void EquipMenu::OnExitState(SDL_Surface *) {
@@ -71,6 +65,12 @@ void EquipMenu::OnResize(int width, int height) {
 
 
 void EquipMenu::HandleEvents(const Input &input) {
+       if (input.JustPressed(Input::SHOULDER_LEFT)) {
+               PreviousHero();
+       }
+       if (input.JustPressed(Input::SHOULDER_RIGHT)) {
+               NextHero();
+       }
        if (actionMenu.IsActive()) {
                if (input.JustPressed(Input::PAD_UP)) {
                        actionMenu.PreviousRow();
@@ -81,10 +81,12 @@ void EquipMenu::HandleEvents(const Input &input) {
                if (input.JustPressed(Input::ACTION_A)) {
                        switch (actionMenu.Selected()) {
                                case CHOICE_EQUIP:
+                                       LoadEquipment();
                                        actionMenu.SetSelected();
                                        equipmentMenu.SetActive();
                                        break;
                                case CHOICE_STRONGEST:
+                                       // TODO: implement "equip strongest" when items' stat effects are done
                                        break;
                                case CHOICE_REMOVE:
                                        actionMenu.SetSelected();
@@ -101,6 +103,57 @@ void EquipMenu::HandleEvents(const Input &input) {
                } else if (input.JustPressed(Input::ACTION_B)) {
                        Ctrl().PopState();
                }
+       } 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();
+                       actionMenu.SetActive();
+               } else if (input.JustPressed(Input::ACTION_A)) {
+                       switch (actionMenu.Selected()) {
+                               case CHOICE_EQUIP:
+                                       equipmentMenu.SetSelected();
+                                       inventoryMenu.SetActive();
+                                       break;
+                               case CHOICE_STRONGEST:
+                               case CHOICE_REMOVE_ALL:
+                                       // invalid state, recover
+                                       equipmentMenu.SetInactive();
+                                       actionMenu.SetActive();
+                                       break;
+                               case CHOICE_REMOVE:
+                                       RemoveItem();
+                                       break;
+                               case CHOICE_DROP:
+                                       DropItem();
+                                       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();
+               }
        }
 }
 
@@ -119,16 +172,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 {
@@ -191,18 +251,29 @@ 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);
 }
 
 
 void EquipMenu::NextHero() {
        cursor = (cursor + 1) % parent->Game().state->partySize;
        LoadEquipment();
+       if (InventoryVisible()) {
+               LoadInventory();
+       }
 }
 
 void EquipMenu::PreviousHero() {
        cursor = (cursor + parent->Game().state->partySize - 1) % parent->Game().state->partySize;
        LoadEquipment();
+       if (InventoryVisible()) {
+               LoadInventory();
+       }
 }
 
 Hero &EquipMenu::GetHero() {
@@ -216,59 +287,87 @@ const Hero &EquipMenu::GetHero() const {
 
 void EquipMenu::LoadEquipment() {
        equipmentMenu.Clear();
-       if (GetHero().HasWeapon()) {
-               equipmentMenu.Add(GetHero().Weapon()->Name(), GetHero().Weapon(), true, GetHero().Weapon()->MenuIcon());
-       } else {
-               equipmentMenu.Add(parent->Res().noEquipmentText, 0, false);
-       }
-       if (GetHero().HasArmor()) {
-               equipmentMenu.Add(GetHero().Armor()->Name(), GetHero().Armor(), true, GetHero().Armor()->MenuIcon());
-       } else {
-               equipmentMenu.Add(parent->Res().noEquipmentText, 0, false);
-       }
-       if (GetHero().HasShield()) {
-               equipmentMenu.Add(GetHero().Shield()->Name(), GetHero().Shield(), true, GetHero().Shield()->MenuIcon());
-       } else {
-               equipmentMenu.Add(parent->Res().noEquipmentText, 0, false);
-       }
-       if (GetHero().HasHelmet()) {
-               equipmentMenu.Add(GetHero().Helmet()->Name(), GetHero().Helmet(), true, GetHero().Helmet()->MenuIcon());
-       } else {
-               equipmentMenu.Add(parent->Res().noEquipmentText, 0, false);
-       }
-       if (GetHero().HasRing()) {
-               equipmentMenu.Add(GetHero().Ring()->Name(), GetHero().Ring(), true, GetHero().Ring()->MenuIcon());
-       } else {
-               equipmentMenu.Add(parent->Res().noEquipmentText, 0, false);
-       }
-       if (GetHero().HasJewel()) {
-               equipmentMenu.Add(GetHero().Jewel()->Name(), GetHero().Jewel(), true, GetHero().Jewel()->MenuIcon());
-       } else {
-               equipmentMenu.Add(parent->Res().noEquipmentText, 0, false);
+       for (int i = 0; i < Hero::EQUIP_COUNT; ++i) {
+               if (GetHero().Equipped(Hero::EquipSlot(i))) {
+                       const Item *item(GetHero().Equipment(Hero::EquipSlot(i)));
+                       equipmentMenu.Add(item->Name(), item, true, item->MenuIcon());
+               } else {
+                       equipmentMenu.Add(parent->Res().noEquipmentText, 0);
+               }
        }
 }
 
 void EquipMenu::RemoveAllEquipment() {
        Inventory &inv(parent->Game().state->inventory);
-       if (GetHero().HasWeapon() && inv.Add(GetHero().Weapon(), 1)) {
-               GetHero().RemoveWeapon();
-       }
-       if (GetHero().HasArmor() && inv.Add(GetHero().Armor(), 1)) {
-               GetHero().RemoveArmor();
+       for (int i = 0; i < Hero::EQUIP_COUNT; ++i) {
+               if (GetHero().Equipped(Hero::EquipSlot(i))
+                               && inv.Add(GetHero().Equipment(Hero::EquipSlot(i)), 1)) {
+                       GetHero().RemoveEquipment(Hero::EquipSlot(i));
+               }
        }
-       if (GetHero().HasShield() && inv.Add(GetHero().Shield(), 1)) {
-               GetHero().RemoveShield();
+       LoadEquipment();
+}
+
+void EquipMenu::RemoveItem() {
+       Inventory &inv(parent->Game().state->inventory);
+       Hero::EquipSlot slot = Hero::EquipSlot(equipmentMenu.SelectedIndex());
+
+       if (GetHero().Equipped(slot) && inv.Add(GetHero().Equipment(slot), 1)) {
+               GetHero().RemoveEquipment(slot);
        }
-       if (GetHero().HasHelmet() && inv.Add(GetHero().Helmet(), 1)) {
-               GetHero().RemoveHelmet();
+
+       LoadEquipment();
+}
+
+void EquipMenu::DropItem() {
+       GetHero().RemoveEquipment(Hero::EquipSlot(equipmentMenu.SelectedIndex()));
+       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));
+               }
        }
-       if (GetHero().HasRing() && inv.Add(GetHero().Ring(), 1)) {
-               GetHero().RemoveRing();
+}
+
+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;
        }
-       if (GetHero().HasJewel() && inv.Add(GetHero().Jewel(), 1)) {
-               GetHero().RemoveJewel();
+
+       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();
 }
 
 }