X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmenu%2FEquipMenu.cpp;h=bfc262430023643d5051c97a974103a2b799680f;hb=c5ee1039b4cc41615c2402ecd7a73f62f9a7d2f5;hp=da24f771f10723d342f00ea97fddf1f8fda58181;hpb=f2abfc21845c29024ce2478f95429801e91ef8e8;p=l2e.git diff --git a/src/menu/EquipMenu.cpp b/src/menu/EquipMenu.cpp index da24f77..bfc2624 100644 --- a/src/menu/EquipMenu.cpp +++ b/src/menu/EquipMenu.cpp @@ -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 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, 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 &offs } void EquipMenu::RenderActionMenu(SDL_Surface *screen, const Vector &offset) const { + const Font &font(*parent->Res().statusFont); + const Frame &frame(*parent->Res().statusFrame); + const Vector 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 &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(); } }