X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmenu%2FEquipMenu.cpp;h=86e8cdbc8b5f5321a369818b7306ec1658a834e0;hb=cc3d698b8c1ad09d7a3f9e3f28bc84e0ac1735ea;hp=bfc262430023643d5051c97a974103a2b799680f;hpb=c5ee1039b4cc41615c2402ecd7a73f62f9a7d2f5;p=l2e.git diff --git a/src/menu/EquipMenu.cpp b/src/menu/EquipMenu.cpp index bfc2624..86e8cdb 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" @@ -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,11 +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 + // TODO: implement "equip strongest" when items' stat effects are done break; case CHOICE_REMOVE: actionMenu.SetSelected(); @@ -105,9 +106,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 +122,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,6 +139,21 @@ 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(); + } } } @@ -149,16 +172,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 +251,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() { @@ -246,120 +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(); - } - 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(); + 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)); + } } 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; + Hero::EquipSlot slot = Hero::EquipSlot(equipmentMenu.SelectedIndex()); + + if (GetHero().Equipped(slot) && inv.Add(GetHero().Equipment(slot), 1)) { + GetHero().RemoveEquipment(slot); } + 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; + 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)); + } + } +} + +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(); } }