X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmenu%2FEquipMenu.cpp;h=199b8e1265c7069a8d169118fb8ed05a4c438276;hb=ec18252fd6199492c40b98abab289c375a5a41b7;hp=df924b18a024ade156e66fdc6784c2184665b9df;hpb=1338442a6db3a706d09622188aad1cdfe183a70b;p=l2e.git diff --git a/src/menu/EquipMenu.cpp b/src/menu/EquipMenu.cpp index df924b1..199b8e1 100644 --- a/src/menu/EquipMenu.cpp +++ b/src/menu/EquipMenu.cpp @@ -50,6 +50,7 @@ EquipMenu::EquipMenu(PartyMenu *parent, int cursor) void EquipMenu::OnEnterState(SDL_Surface *) { equipmentMenu.SetInactive(); + inventoryMenu.SetInactive(); } void EquipMenu::OnExitState(SDL_Surface *) { @@ -81,6 +82,7 @@ void EquipMenu::HandleEvents(const Input &input) { if (input.JustPressed(Input::ACTION_A)) { switch (actionMenu.Selected()) { case CHOICE_EQUIP: + LoadEquipment(); actionMenu.SetSelected(); equipmentMenu.SetActive(); break; @@ -105,9 +107,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 +123,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 +140,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 +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 { @@ -221,7 +252,12 @@ 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); } @@ -283,4 +319,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(); +} + }