+
+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();
+}
+