X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmenu%2FEquipMenu.cpp;h=d04d2f4315ee99e68dbc387d68c737fe98ec6e9b;hb=092a2dd175a4001a495c84ee85211734fb928c83;hp=30cc1798a70c9b55dca4f20ea3fa1ba1a74c24b4;hpb=5ff22859ee5966297862d3384206fa2cf52da7ca;p=l2e.git diff --git a/src/menu/EquipMenu.cpp b/src/menu/EquipMenu.cpp index 30cc179..d04d2f4 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; @@ -50,6 +44,7 @@ EquipMenu::EquipMenu(PartyMenu *parent, int cursor) void EquipMenu::OnEnterState(SDL_Surface *) { equipmentMenu.SetInactive(); + inventoryMenu.SetInactive(); } void EquipMenu::OnExitState(SDL_Surface *) { @@ -71,6 +66,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 +82,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,10 +104,61 @@ 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(); + } } } -void EquipMenu::UpdateWorld(float deltaT) { +void EquipMenu::UpdateWorld(Uint32 deltaT) { } @@ -119,16 +173,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 { @@ -191,18 +252,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() { @@ -216,59 +288,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(); } }