]> git.localhorst.tv Git - l2e.git/commitdiff
preliminary solution for loading inventory in item select
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Thu, 9 Aug 2012 15:21:40 +0000 (17:21 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Thu, 9 Aug 2012 15:21:40 +0000 (17:21 +0200)
src/battle/BattleState.cpp
src/battle/BattleState.h
src/battle/Resources.h
src/common/Item.h
src/main.cpp

index 0c983e7fa2d964fddff019e21a962a64ef662f1b..58f29659e7c4500656b5c70f1faf5595e3e14b8c 100644 (file)
 #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 <iomanip>
 #include <stdexcept>
+#include <sstream>
 
 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) {
index 074578e18312252295b6da1dcb210b262243bff5..4b0ffcff43c591f41f754b62e3f983208ef1479c 100644 (file)
 #include "../graphics/Menu.h"
 
 #include <vector>
+#include <string>
 #include <SDL.h>
 
 namespace app { class Input; }
+namespace common {
+       class Inventory;
+       class Item;
+}
 namespace graphics {
        class Font;
        class Frame;
@@ -82,8 +87,8 @@ public:
        const graphics::Menu</* Spell */ void *> &GetSpellMenu() const { return spellMenus[activeHero]; }
        graphics::Menu</* Ikari or Item */ void *> &GetIkariMenu() { return ikariMenus[activeHero]; }
        const graphics::Menu</* Ikari or Item */ void *> &GetIkariMenu() const { return ikariMenus[activeHero]; }
-       graphics::Menu</* Item */ void *> &GetItemMenu() { return itemMenu; }
-               const graphics::Menu</* Item */ void *> &GetItemMenu() const { return itemMenu; }
+       graphics::Menu<const common::Item *> &GetItemMenu() { return itemMenu; }
+       const graphics::Menu<const common::Item *> &GetItemMenu() const { return itemMenu; }
 
 public:
        geometry::Vector<int> CalculateScreenOffset(SDL_Surface *screen) const {
@@ -99,6 +104,9 @@ public:
        void RenderHeroes(SDL_Surface *screen, const geometry::Vector<int> &offset);
        void RenderHeroTags(SDL_Surface *screen, const geometry::Vector<int> &offset);
 
+private:
+       void LoadInventory();
+
 private:
        SDL_Surface *background;
        const PartyLayout *monstersLayout;
@@ -111,7 +119,8 @@ private:
        std::vector<Monster> monsters;
        std::vector<Hero> heroes;
        std::vector<graphics::Menu</* Spell */ void *> > spellMenus;
-       graphics::Menu</* Item */ void *> itemMenu;
+       graphics::Menu<const common::Item *> itemMenu;
+       std::vector<std::string> itemMenuStrings;
        std::vector<graphics::Menu</* Ikari or Item */ void *> > ikariMenus;
        std::vector<HeroTag> heroTags;
        std::vector<AttackChoice> attackChoices;
index 6cfc365add2a95d155273f0b6d1efb6133b8a6fc..b07e2b21f0cf60472aa769013ac729fdc29cc616 100644 (file)
 
 #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</* Spell */ void *> spellMenuPrototype;
 
+       common::Inventory *inventory;
        const char *itemMenuHeadline;
-       graphics::Menu</* Spell */ void *> itemMenuPrototype;
+       graphics::Menu<const common::Item *> itemMenuPrototype;
 
        const char *ikariMenuHeadline;
        graphics::Menu</* Ikari or Item */ void *> ikariMenuPrototype;
@@ -74,6 +79,7 @@ struct Resources {
 
        , menuCursor(0)
        , spellMenuHeadline("")
+       , inventory(0)
        , itemMenuHeadline("")
        , ikariMenuHeadline("")
        { }
index cdb106daa95ff33b57af77404e3ca9fdb4b9e4f3..2f662074c286e75b619a8d539899637fd96ba427 100644 (file)
@@ -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;
index e25eb7eae9e2e7d9396abae7ba7fb95144f5518e..cd76905d55b1371a02152d8248454c7996514cb0 100644 (file)
@@ -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</* Item */ void *>(&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<const common::Item *>(&normalFont, &disabledFont, &handCursorSprite, 15, 6, 8, 16, 1, 32);
 
                battleRes.ikariMenuHeadline = "Please choose equipment.";
                battleRes.ikariMenuPrototype = Menu</* Item */ void *>(&normalFont, &disabledFont, &handCursorSprite, 26, 6, 8, 16, 1, 32);