]> git.localhorst.tv Git - l2e.git/blobdiff - src/menu/EquipMenu.cpp
implemented equipment removing and dropping
[l2e.git] / src / menu / EquipMenu.cpp
index da24f771f10723d342f00ea97fddf1f8fda58181..bfc262430023643d5051c97a974103a2b799680f 100644 (file)
@@ -15,6 +15,7 @@
 #include "../common/GameConfig.h"
 #include "../common/GameState.h"
 #include "../common/Hero.h"
+#include "../common/Inventory.h"
 #include "../common/Item.h"
 #include "../common/Stats.h"
 #include "../graphics/Font.h"
@@ -22,6 +23,7 @@
 
 using app::Input;
 using common::Hero;
+using common::Inventory;
 using common::Item;
 using common::Stats;
 using geometry::Vector;
@@ -69,7 +71,67 @@ void EquipMenu::OnResize(int width, int height) {
 
 
 void EquipMenu::HandleEvents(const Input &input) {
-
+       if (actionMenu.IsActive()) {
+               if (input.JustPressed(Input::PAD_UP)) {
+                       actionMenu.PreviousRow();
+               }
+               if (input.JustPressed(Input::PAD_DOWN)) {
+                       actionMenu.NextRow();
+               }
+               if (input.JustPressed(Input::ACTION_A)) {
+                       switch (actionMenu.Selected()) {
+                               case CHOICE_EQUIP:
+                                       actionMenu.SetSelected();
+                                       equipmentMenu.SetActive();
+                                       break;
+                               case CHOICE_STRONGEST:
+                                       // TODO
+                                       break;
+                               case CHOICE_REMOVE:
+                                       actionMenu.SetSelected();
+                                       equipmentMenu.SetActive();
+                                       break;
+                               case CHOICE_REMOVE_ALL:
+                                       RemoveAllEquipment();
+                                       break;
+                               case CHOICE_DROP:
+                                       actionMenu.SetSelected();
+                                       equipmentMenu.SetActive();
+                                       break;
+                       }
+               } else if (input.JustPressed(Input::ACTION_B)) {
+                       Ctrl().PopState();
+               }
+       } else if (equipmentMenu.IsActive()) {
+               if (input.JustPressed(Input::PAD_UP)) {
+                       equipmentMenu.PreviousRow();
+               }
+               if (input.JustPressed(Input::PAD_DOWN)) {
+                       equipmentMenu.NextRow();
+               }
+               if (input.JustPressed(Input::ACTION_B)) {
+                       equipmentMenu.SetInactive();
+                       actionMenu.SetActive();
+               } else if (input.JustPressed(Input::ACTION_A)) {
+                       switch (actionMenu.Selected()) {
+                               case CHOICE_EQUIP:
+                                       // TODO
+                                       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;
+                       }
+               }
+       }
 }
 
 void EquipMenu::UpdateWorld(float deltaT) {
@@ -87,12 +149,16 @@ 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, equipOffset);
+       RenderEquipmentMenu(screen, offset + equipOffset);
+       RenderActionMenu(screen, offset + menuOffset);
 }
 
 int EquipMenu::Width() const {
@@ -146,7 +212,12 @@ void EquipMenu::RenderEquipmentMenu(SDL_Surface *screen, const Vector<int> &offs
 }
 
 void EquipMenu::RenderActionMenu(SDL_Surface *screen, const Vector<int> &offset) const {
+       const Font &font(*parent->Res().statusFont);
+       const Frame &frame(*parent->Res().statusFrame);
+       const Vector<int> menuOffset(3 * font.CharWidth(), font.CharHeight() + font.CharHeight() / 2);
 
+       frame.Draw(screen, offset, 15 * font.CharWidth(), 10 * font.CharHeight());
+       actionMenu.Draw(screen, offset + menuOffset);
 }
 
 void EquipMenu::RenderInventoryMenu(SDL_Surface *screen, const Vector<int> &offset) const {
@@ -164,18 +235,131 @@ void EquipMenu::PreviousHero() {
        LoadEquipment();
 }
 
+Hero &EquipMenu::GetHero() {
+       return *parent->Game().state->party[cursor];
+}
+
 const Hero &EquipMenu::GetHero() const {
        return *parent->Game().state->party[cursor];
 }
 
+
 void EquipMenu::LoadEquipment() {
        equipmentMenu.Clear();
-       equipmentMenu.Add(GetHero().Weapon()->Name(), GetHero().Weapon(), true, GetHero().Weapon()->MenuIcon());
-       equipmentMenu.Add(GetHero().Armor()->Name(), GetHero().Armor(), true, GetHero().Armor()->MenuIcon());
-       equipmentMenu.Add(GetHero().Shield()->Name(), GetHero().Shield(), true, GetHero().Shield()->MenuIcon());
-       equipmentMenu.Add(GetHero().Helmet()->Name(), GetHero().Helmet(), true, GetHero().Helmet()->MenuIcon());
-       equipmentMenu.Add(GetHero().Ring()->Name(), GetHero().Ring(), true, GetHero().Ring()->MenuIcon());
-       equipmentMenu.Add(GetHero().Jewel()->Name(), GetHero().Jewel(), true, GetHero().Jewel()->MenuIcon());
+       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);
+       }
+}
+
+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();
+       }
+       if (GetHero().HasShield() && inv.Add(GetHero().Shield(), 1)) {
+               GetHero().RemoveShield();
+       }
+       if (GetHero().HasHelmet() && inv.Add(GetHero().Helmet(), 1)) {
+               GetHero().RemoveHelmet();
+       }
+       if (GetHero().HasRing() && inv.Add(GetHero().Ring(), 1)) {
+               GetHero().RemoveRing();
+       }
+       if (GetHero().HasJewel() && inv.Add(GetHero().Jewel(), 1)) {
+               GetHero().RemoveJewel();
+       }
+       LoadEquipment();
+}
+
+void EquipMenu::RemoveItem() {
+       Inventory &inv(parent->Game().state->inventory);
+       switch (equipmentMenu.SelectedIndex()) {
+               case 0:
+                       if (GetHero().HasWeapon() && inv.Add(GetHero().Weapon(), 1)) {
+                               GetHero().RemoveWeapon();
+                       }
+                       break;
+               case 1:
+                       if (GetHero().HasArmor() && inv.Add(GetHero().Armor(), 1)) {
+                               GetHero().RemoveArmor();
+                       }
+                       break;
+               case 2:
+                       if (GetHero().HasShield() && inv.Add(GetHero().Shield(), 1)) {
+                               GetHero().RemoveShield();
+                       }
+                       break;
+               case 3:
+                       if (GetHero().HasHelmet() && inv.Add(GetHero().Helmet(), 1)) {
+                               GetHero().RemoveHelmet();
+                       }
+                       break;
+               case 4:
+                       if (GetHero().HasRing() && inv.Add(GetHero().Ring(), 1)) {
+                               GetHero().RemoveRing();
+                       }
+                       break;
+               case 5:
+                       if (GetHero().HasJewel() && inv.Add(GetHero().Jewel(), 1)) {
+                               GetHero().RemoveJewel();
+                       }
+                       break;
+       }
+       LoadEquipment();
+}
+
+void EquipMenu::DropItem() {
+       switch (equipmentMenu.SelectedIndex()) {
+               case 0:
+                       GetHero().RemoveWeapon();
+                       break;
+               case 1:
+                       GetHero().RemoveArmor();
+                       break;
+               case 2:
+                       GetHero().RemoveShield();
+                       break;
+               case 3:
+                       GetHero().RemoveHelmet();
+                       break;
+               case 4:
+                       GetHero().RemoveRing();
+                       break;
+               case 5:
+                       GetHero().RemoveJewel();
+                       break;
+       }
+       LoadEquipment();
 }
 
 }