]> git.localhorst.tv Git - l2e.git/blobdiff - src/menu/EquipMenu.cpp
added menu cursor animations
[l2e.git] / src / menu / EquipMenu.cpp
index c60ea30a92795cb56fc85861b5ca95f03bd7f8ab..1a433beae3d2fb95b24340e495b7828ff340041a 100644 (file)
@@ -1,10 +1,3 @@
-/*
- * EquipMenu.cpp
- *
- *  Created on: Nov 18, 2012
- *      Author: holy
- */
-
 #include "EquipMenu.h"
 
 #include "HeroStatus.h"
 #include "../common/Stats.h"
 #include "../graphics/Font.h"
 #include "../graphics/Frame.h"
+#include "../math/Vector.h"
 
 using app::Input;
 using common::Hero;
 using common::Inventory;
 using common::Item;
 using common::Stats;
-using geometry::Vector;
+using math::Vector;
 using graphics::Font;
 using graphics::Frame;
 
@@ -49,8 +43,11 @@ EquipMenu::EquipMenu(PartyMenu *parent, int cursor)
 
 
 void EquipMenu::OnEnterState(SDL_Surface *) {
+       actionMenu.StartAnimation(Ctrl());
        equipmentMenu.SetInactive();
+       equipmentMenu.StartAnimation(Ctrl());
        inventoryMenu.SetInactive();
+       inventoryMenu.StartAnimation(Ctrl());
 }
 
 void EquipMenu::OnExitState(SDL_Surface *) {
@@ -72,6 +69,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();
@@ -87,7 +90,7 @@ void EquipMenu::HandleEvents(const Input &input) {
                                        equipmentMenu.SetActive();
                                        break;
                                case CHOICE_STRONGEST:
-                                       // TODO
+                                       // TODO: implement "equip strongest" when items' stat effects are done
                                        break;
                                case CHOICE_REMOVE:
                                        actionMenu.SetSelected();
@@ -148,7 +151,9 @@ void EquipMenu::HandleEvents(const Input &input) {
                        inventoryMenu.NextRow();
                }
                if (input.JustPressed(Input::ACTION_A)) {
-                       // TODO: equip selected item
+                       EquipSelected();
+                       inventoryMenu.SetInactive();
+                       equipmentMenu.SetActive();
                } else if (input.JustPressed(Input::ACTION_B)) {
                        inventoryMenu.SetInactive();
                        equipmentMenu.SetActive();
@@ -156,7 +161,7 @@ void EquipMenu::HandleEvents(const Input &input) {
        }
 }
 
-void EquipMenu::UpdateWorld(float deltaT) {
+void EquipMenu::UpdateWorld(Uint32 deltaT) {
 
 }
 
@@ -262,11 +267,17 @@ void EquipMenu::RenderInventoryMenu(SDL_Surface *screen, const Vector<int> &offs
 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() {
@@ -285,7 +296,7 @@ void EquipMenu::LoadEquipment() {
                        const Item *item(GetHero().Equipment(Hero::EquipSlot(i)));
                        equipmentMenu.Add(item->Name(), item, true, item->MenuIcon());
                } else {
-                       equipmentMenu.Add(parent->Res().noEquipmentText, 0, false);
+                       equipmentMenu.Add(parent->Res().noEquipmentText, 0);
                }
        }
 }
@@ -337,4 +348,30 @@ void EquipMenu::LoadInventory() {
        }
 }
 
+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();
+}
+
 }