-/*
- * InventoryMenu.cpp
- *
- * Created on: Nov 4, 2012
- * Author: holy
- */
-
#include "InventoryMenu.h"
#include "PartyMenu.h"
#include "Resources.h"
+#include "../app/Application.h"
#include "../app/Input.h"
#include "../common/GameConfig.h"
#include "../common/GameState.h"
#include "../common/Item.h"
#include "../graphics/Font.h"
#include "../graphics/Frame.h"
+#include "../math/Vector.h"
using app::Input;
using common::Inventory;
using common::Item;
-using geometry::Vector;
+using math::Vector;
using graphics::Font;
using graphics::Frame;
+using std::swap;
namespace menu {
: parent(parent)
, menu(*parent->Res().itemMenuProperties)
, itemMenu(*parent->Res().inventoryMenuProperties) {
- menu.Add(parent->Res().itemMenuUseText, 0);
- menu.Add(parent->Res().itemMenuSortText, 1);
- menu.Add(parent->Res().itemMenuDropText, 2);
+ menu.Add(parent->Res().itemMenuUseText, CHOICE_USE);
+ menu.Add(parent->Res().itemMenuSortText, CHOICE_SORT);
+ menu.Add(parent->Res().itemMenuDropText, CHOICE_DROP);
}
void InventoryMenu::OnEnterState(SDL_Surface *) {
+ menu.SetSelected();
+ menu.StartAnimation(Ctrl());
+ LoadInventory();
+ itemMenu.StartAnimation(Ctrl());
+}
+
+void InventoryMenu::LoadInventory() {
const Inventory &inv(parent->Game().state->inventory);
itemMenu.Clear();
itemMenu.Reserve(inv.MaxItems());
void InventoryMenu::HandleEvents(const Input &input) {
- if (input.JustPressed(Input::PAD_LEFT)) {
- menu.PreviousItem();
- }
- if (input.JustPressed(Input::PAD_RIGHT)) {
- menu.NextItem();
+ if (menu.IsActive()) {
+ if (input.JustPressed(Input::PAD_LEFT)) {
+ menu.PreviousItem();
+ }
+ if (input.JustPressed(Input::PAD_RIGHT)) {
+ menu.NextItem();
+ }
+ } else {
+ if (input.JustPressed(Input::PAD_UP)) {
+ itemMenu.PreviousItem();
+ }
+ if (input.JustPressed(Input::PAD_DOWN)) {
+ itemMenu.NextItem();
+ }
}
- if (input.JustPressed(Input::PAD_UP)) {
- itemMenu.PreviousItem();
+ if (input.JustPressed(Input::ACTION_A)) {
+ if (menu.IsActive()) {
+ if (menu.Selected() == CHOICE_SORT) {
+ parent->Game().state->inventory.Sort();
+ LoadInventory();
+ } else {
+ menu.SetSelected();
+ itemMenu.SetActive();
+ }
+ } else if (itemMenu.IsActive()) {
+ itemMenu.SetDualSelection();
+ } else if (itemMenu.SelectedIndex() == itemMenu.SecondaryIndex()) {
+ switch (menu.Selected()) {
+ case CHOICE_USE:
+ if (itemMenu.Selected()->CanUseOnStatusScreen()) {
+ // TODO: implement item use
+ }
+ itemMenu.SetActive();
+ break;
+ case CHOICE_SORT:
+ // invalid state, recover
+ menu.SetActive();
+ itemMenu.SetInactive();
+ break;
+ case CHOICE_DROP:
+ if (itemMenu.Selected()->CanDrop()) {
+ parent->Game().state->inventory.RemoveAll(itemMenu.Selected());
+ itemMenu.ClearEntry(itemMenu.SelectedIndex());
+ }
+ itemMenu.SetActive();
+ break;
+ }
+ } else {
+ parent->Game().state->inventory.SwapEntriesAt(
+ itemMenu.SelectedIndex(),
+ itemMenu.SecondaryIndex());
+ itemMenu.SwapSelected();
+ itemMenu.SetActive();
+ }
}
- if (input.JustPressed(Input::PAD_DOWN)) {
- itemMenu.NextItem();
+ if (input.JustPressed(Input::ACTION_B)) {
+ if (menu.IsActive()) {
+ Ctrl().PopState();
+ } else if (itemMenu.IsActive()) {
+ menu.SetActive();
+ itemMenu.SetInactive();
+ } else {
+ itemMenu.SetActive();
+ }
}
}
-void InventoryMenu::UpdateWorld(float deltaT) {
+void InventoryMenu::UpdateWorld(Uint32 deltaT) {
}