X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmenu%2FEquipMenu.cpp;h=1a433beae3d2fb95b24340e495b7828ff340041a;hb=ec824200aec12d6870b70304bcd2e2aeadba767b;hp=df924b18a024ade156e66fdc6784c2184665b9df;hpb=1338442a6db3a706d09622188aad1cdfe183a70b;p=l2e.git diff --git a/src/menu/EquipMenu.cpp b/src/menu/EquipMenu.cpp index df924b1..1a433be 100644 --- a/src/menu/EquipMenu.cpp +++ b/src/menu/EquipMenu.cpp @@ -1,10 +1,3 @@ -/* - * EquipMenu.cpp - * - * Created on: Nov 18, 2012 - * Author: holy - */ - #include "EquipMenu.h" #include "HeroStatus.h" @@ -20,13 +13,14 @@ #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,7 +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 *) { @@ -71,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(); @@ -81,11 +85,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 + // TODO: implement "equip strongest" when items' stat effects are done break; case CHOICE_REMOVE: actionMenu.SetSelected(); @@ -105,9 +110,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 +126,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,10 +143,25 @@ 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(); + } } } -void EquipMenu::UpdateWorld(float deltaT) { +void EquipMenu::UpdateWorld(Uint32 deltaT) { } @@ -149,16 +176,23 @@ void EquipMenu::Render(SDL_Surface *screen) { Vector equipOffset( 17 * parent->Res().statusFont->CharWidth(), 4 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8); - Vector 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 inventoryOffset( + parent->Res().statusFont->CharWidth(), + 17 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8); + RenderInventoryMenu(screen, offset + inventoryOffset); + } else { + Vector 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,18 +255,29 @@ void EquipMenu::RenderActionMenu(SDL_Surface *screen, const Vector &offset) } void EquipMenu::RenderInventoryMenu(SDL_Surface *screen, const Vector &offset) const { + const Font &font(*parent->Res().normalFont); + const Frame &frame(*parent->Res().statusFrame); + const Vector 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() { @@ -251,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); } } } @@ -283,4 +328,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(); +} + }