From 57a9949304b1d938bdb795213a8f46a7e28fcf7c Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Thu, 9 Aug 2012 17:21:40 +0200 Subject: [PATCH] preliminary solution for loading inventory in item select --- src/battle/BattleState.cpp | 30 ++++++++++++++++++ src/battle/BattleState.h | 15 +++++++-- src/battle/Resources.h | 8 ++++- src/common/Item.h | 13 ++++++-- src/main.cpp | 62 ++++++++++++++++++++++++-------------- 5 files changed, 99 insertions(+), 29 deletions(-) diff --git a/src/battle/BattleState.cpp b/src/battle/BattleState.cpp index 0c983e7..58f2965 100644 --- a/src/battle/BattleState.cpp +++ b/src/battle/BattleState.cpp @@ -11,13 +11,19 @@ #include "states/SelectMoveAction.h" #include "../app/Application.h" #include "../app/Input.h" +#include "../common/Inventory.h" +#include "../common/Item.h" #include "../geometry/operators.h" #include "../graphics/Sprite.h" +#include #include +#include using app::Application; using app::Input; +using common::Inventory; +using common::Item; using geometry::Point; using geometry::Vector; using graphics::Menu; @@ -59,6 +65,30 @@ void BattleState::EnterState(Application &ctrl, SDL_Surface *screen) { } // TODO: insert item menu entries itemMenu = res->itemMenuPrototype; + LoadInventory(); +} + +void BattleState::LoadInventory() { + const Inventory &inv(*res->inventory); + itemMenu.Clear(); + itemMenu.Reserve(inv.MaxItems()); + itemMenuStrings.clear(); + itemMenuStrings.resize(inv.MaxItems()); + int itemNameLength(itemMenu.CharsPerEntry() - 3); + // TODO: better (maybe intrusive) solution for menus with counts + for (int i(0); i < inv.MaxItems(); ++i) { + const Item *item(inv.ItemAt(i)); + if (item) { + std::stringstream s; + s << std::setw(itemNameLength) << std::left << std::setfill(' ') << item->Name(); + s << ':'; + s << inv.ItemCountAt(i); + itemMenuStrings[i] = s.str(); + itemMenu.Add(itemMenuStrings[i].c_str(), item, item->CanUseInBattle(), item->MenuIcon()); + } else { + itemMenu.Add("", 0, false); + } + } } void BattleState::ExitState(Application &ctrl, SDL_Surface *screen) { diff --git a/src/battle/BattleState.h b/src/battle/BattleState.h index 074578e..4b0ffcf 100644 --- a/src/battle/BattleState.h +++ b/src/battle/BattleState.h @@ -21,9 +21,14 @@ #include "../graphics/Menu.h" #include +#include #include namespace app { class Input; } +namespace common { + class Inventory; + class Item; +} namespace graphics { class Font; class Frame; @@ -82,8 +87,8 @@ public: const graphics::Menu &GetSpellMenu() const { return spellMenus[activeHero]; } graphics::Menu &GetIkariMenu() { return ikariMenus[activeHero]; } const graphics::Menu &GetIkariMenu() const { return ikariMenus[activeHero]; } - graphics::Menu &GetItemMenu() { return itemMenu; } - const graphics::Menu &GetItemMenu() const { return itemMenu; } + graphics::Menu &GetItemMenu() { return itemMenu; } + const graphics::Menu &GetItemMenu() const { return itemMenu; } public: geometry::Vector CalculateScreenOffset(SDL_Surface *screen) const { @@ -99,6 +104,9 @@ public: void RenderHeroes(SDL_Surface *screen, const geometry::Vector &offset); void RenderHeroTags(SDL_Surface *screen, const geometry::Vector &offset); +private: + void LoadInventory(); + private: SDL_Surface *background; const PartyLayout *monstersLayout; @@ -111,7 +119,8 @@ private: std::vector monsters; std::vector heroes; std::vector > spellMenus; - graphics::Menu itemMenu; + graphics::Menu itemMenu; + std::vector itemMenuStrings; std::vector > ikariMenus; std::vector heroTags; std::vector attackChoices; diff --git a/src/battle/Resources.h b/src/battle/Resources.h index 6cfc365..b07e2b2 100644 --- a/src/battle/Resources.h +++ b/src/battle/Resources.h @@ -10,6 +10,10 @@ #include "../graphics/Menu.h" +namespace common { + class Inventory; + class Item; +} namespace graphics { class Font; class Frame; @@ -45,8 +49,9 @@ struct Resources { const char *spellMenuHeadline; graphics::Menu spellMenuPrototype; + common::Inventory *inventory; const char *itemMenuHeadline; - graphics::Menu itemMenuPrototype; + graphics::Menu itemMenuPrototype; const char *ikariMenuHeadline; graphics::Menu ikariMenuPrototype; @@ -74,6 +79,7 @@ struct Resources { , menuCursor(0) , spellMenuHeadline("") + , inventory(0) , itemMenuHeadline("") , ikariMenuHeadline("") { } diff --git a/src/common/Item.h b/src/common/Item.h index cdb106d..2f66207 100644 --- a/src/common/Item.h +++ b/src/common/Item.h @@ -20,6 +20,8 @@ public: Item(); public: + const char *Name() const { return name; } + bool IsMostUseful() const { return usability & USABILITY_MOST_USEFUL; } bool IsEquipable() const { return usability & USABILITY_EQUIPABLE; } bool IsCursed() const { return usability & USABILITY_CURSED; } @@ -72,6 +74,12 @@ public: bool HasBattleAnimation() const { return properties & PROPERTY_HAS_BATTLE_ANIMATION; } bool HasIkariEffect() const { return properties & PROPERTY_HAS_IKARI_EFFECT; } +// temporary setters +public: + void SetName(const char *n) { name = n; } + void SetMenuIcon(const graphics::Sprite *icon) { menuIcon = icon; } + void SetUsableInBattle() { usability |= USABILITY_BATTLE; } + private: enum Usability { USABILITY_MOST_USEFUL = 1, @@ -131,8 +139,9 @@ private: }; private: - graphics::Sprite *menuIcon; - graphics::Sprite *chestIcon; + const char *name; + const graphics::Sprite *menuIcon; + const graphics::Sprite *chestIcon; Uint16 value; Uint16 properties; diff --git a/src/main.cpp b/src/main.cpp index e25eb7e..cd76905 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,6 +12,8 @@ #include "battle/Monster.h" #include "battle/PartyLayout.h" #include "battle/Resources.h" +#include "common/Inventory.h" +#include "common/Item.h" #include "geometry/Point.h" #include "graphics/Font.h" #include "graphics/Frame.h" @@ -33,6 +35,8 @@ using battle::BattleState; using battle::Hero; using battle::Monster; using battle::PartyLayout; +using common::Inventory; +using common::Item; using geometry::Point; using graphics::Font; using graphics::Frame; @@ -225,30 +229,42 @@ int main(int argc, char **argv) { Sprite ringIcon(itemIcons, 16, 16, 0, 160); Sprite stoneIcon(itemIcons, 16, 16, 0, 176); + Inventory inventory; + Item antidote; + antidote.SetName("Antidote"); + antidote.SetMenuIcon(&potionIcon); + antidote.SetUsableInBattle(); + inventory.Add(&antidote, 9); + Item magicJar; + magicJar.SetName("Magic jar"); + magicJar.SetMenuIcon(&potionIcon); + magicJar.SetUsableInBattle(); + inventory.Add(&magicJar, 4); + Item hiPotion; + hiPotion.SetName("Hi-Potion"); + hiPotion.SetMenuIcon(&potionIcon); + hiPotion.SetUsableInBattle(); + inventory.Add(&hiPotion, 4); + Item powerPotion; + powerPotion.SetName("Power potion"); + powerPotion.SetMenuIcon(&potionIcon); + inventory.Add(&powerPotion, 4); + Item escape; + escape.SetName("Escape"); + inventory.Add(&escape, 2); + Item sleepBall; + sleepBall.SetName("Sleep ball"); + sleepBall.SetMenuIcon(&ballIcon); + sleepBall.SetUsableInBattle(); + inventory.Add(&sleepBall, 1); + Item figgoru; + figgoru.SetName("Figgoru"); + figgoru.SetMenuIcon(&crankIcon); + inventory.Add(&figgoru, 1); + battleRes.inventory = &inventory; + battleRes.itemMenuHeadline = "Please choose an item."; - battleRes.itemMenuPrototype = Menu(&normalFont, &disabledFont, &handCursorSprite, 15, 6, 8, 16, 1, 32); - battleRes.itemMenuPrototype.Add("Antidote : 9", 0, true, &potionIcon); - battleRes.itemMenuPrototype.Add("Magic jar : 4", 0, true, &potionIcon); - battleRes.itemMenuPrototype.Add("Miracle : 4", 0, true, &potionIcon); - battleRes.itemMenuPrototype.Add("Hi-Potion : 6", 0, true, &potionIcon); - battleRes.itemMenuPrototype.Add("Hi-Magic : 7", 0, true, &potionIcon); - battleRes.itemMenuPrototype.Add("Regain : 4", 0, true, &potionIcon); - battleRes.itemMenuPrototype.Add("Power potion: 4", 0, false, &potionIcon); - battleRes.itemMenuPrototype.Add("Life potion : 1", 0, false, &potionIcon); - battleRes.itemMenuPrototype.Add("Escape : 2", 0, false); - battleRes.itemMenuPrototype.Add("Power gourd : 3", 0, true, &potionIcon); - battleRes.itemMenuPrototype.Add("Mystery pin : 2", 0, true, &potionIcon); - battleRes.itemMenuPrototype.Add("Sleep ball : 1", 0, false, &ballIcon); - battleRes.itemMenuPrototype.Add("Figgoru : 1", 0, false, &crankIcon); - battleRes.itemMenuPrototype.Add("Spear : 1", 0, false, &spearIcon); - battleRes.itemMenuPrototype.Add("Silvo rapier: 1", 0, false, &swordIcon); - battleRes.itemMenuPrototype.Add("Rainy ax : 1", 0, false, &axIcon); - battleRes.itemMenuPrototype.Add("Pounder rod : 2", 0, false, &rodIcon); - battleRes.itemMenuPrototype.Add("Silver mail : 2", 0, false, &armorIcon); - battleRes.itemMenuPrototype.Add("Slash shield: 2", 0, false, &shieldIcon); - battleRes.itemMenuPrototype.Add("Golden helm : 1", 0, false, &helmetIcon); - battleRes.itemMenuPrototype.Add("Protect ring: 1", 0, false, &ringIcon); - battleRes.itemMenuPrototype.Add("Mysto jewel : 1", 0, false, &stoneIcon); + battleRes.itemMenuPrototype = Menu(&normalFont, &disabledFont, &handCursorSprite, 15, 6, 8, 16, 1, 32); battleRes.ikariMenuHeadline = "Please choose equipment."; battleRes.ikariMenuPrototype = Menu(&normalFont, &disabledFont, &handCursorSprite, 26, 6, 8, 16, 1, 32); -- 2.39.2