]> git.localhorst.tv Git - l2e.git/commitdiff
added second column in ikari menu
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 10 Aug 2012 15:11:06 +0000 (17:11 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 10 Aug 2012 15:11:06 +0000 (17:11 +0200)
src/battle/BattleState.cpp
src/battle/BattleState.h
src/graphics/Menu.h
src/main.cpp

index da3dad6de234f43263860d1e5b3dfdb85e16ea95..3f734f84d8ce5bc868f15ad8ea041f2439fce99b 100644 (file)
@@ -11,6 +11,7 @@
 #include "states/SelectMoveAction.h"
 #include "../app/Application.h"
 #include "../app/Input.h"
+#include "../common/Ikari.h"
 #include "../common/Inventory.h"
 #include "../common/Item.h"
 #include "../common/Spell.h"
@@ -59,7 +60,7 @@ void BattleState::EnterState(Application &ctrl, SDL_Surface *screen) {
                spellMenus.push_back(res->spellMenuPrototype);
                LoadSpellMenu(i);
                ikariMenus.push_back(res->ikariMenuPrototype);
-               // TODO: insert ikari menu entries
+               LoadIkariMenu(i);
                heroTags[i] = HeroTag(&heroes[i], attackChoices + i, res, HeroTag::Alignment((i + 1) % 2));
        }
 
@@ -84,6 +85,83 @@ void BattleState::LoadSpellMenu(vector<Hero>::size_type index) {
        }
 }
 
+void BattleState::LoadIkariMenu(vector<Hero>::size_type index) {
+       ikariMenus[index].Clear();
+       ikariMenus[index].Reserve(6);
+
+       if (HeroAt(index).HasWeapon()) {
+               ikariMenus[index].Add(
+                               HeroAt(index).Weapon()->Name(),
+                               HeroAt(index).Weapon(),
+                               HeroAt(index).Weapon()->HasIkari() && HeroAt(index).Weapon()->GetIkari()->Cost() <= HeroAt(index).IP(),
+                               res->weaponMenuIcon,
+                               0,
+                               HeroAt(index).Weapon()->HasIkari() ? HeroAt(index).Weapon()->GetIkari()->Name() : "");
+       } else {
+               ikariMenus[index].Add(res->noEquipmentText, 0, false, res->weaponMenuIcon);
+       }
+
+       if (HeroAt(index).HasArmor()) {
+               ikariMenus[index].Add(
+                               HeroAt(index).Armor()->Name(),
+                               HeroAt(index).Armor(),
+                               HeroAt(index).Armor()->HasIkari() && HeroAt(index).Armor()->GetIkari()->Cost() <= HeroAt(index).IP(),
+                               res->armorMenuIcon,
+                               0,
+                               HeroAt(index).Armor()->HasIkari() ? HeroAt(index).Armor()->GetIkari()->Name() : "");
+       } else {
+               ikariMenus[index].Add(res->noEquipmentText, 0, false, res->armorMenuIcon);
+       }
+
+       if (HeroAt(index).HasShield()) {
+               ikariMenus[index].Add(
+                               HeroAt(index).Shield()->Name(),
+                               HeroAt(index).Shield(),
+                               HeroAt(index).Shield()->HasIkari() && HeroAt(index).Shield()->GetIkari()->Cost() <= HeroAt(index).IP(),
+                               res->shieldMenuIcon,
+                               0,
+                               HeroAt(index).Shield()->HasIkari() ? HeroAt(index).Shield()->GetIkari()->Name() : "");
+       } else {
+               ikariMenus[index].Add(res->noEquipmentText, 0, false, res->shieldMenuIcon);
+       }
+
+       if (HeroAt(index).HasHelmet()) {
+               ikariMenus[index].Add(
+                               HeroAt(index).Helmet()->Name(),
+                               HeroAt(index).Helmet(),
+                               HeroAt(index).Helmet()->HasIkari() && HeroAt(index).Helmet()->GetIkari()->Cost() <= HeroAt(index).IP(),
+                               res->helmetMenuIcon,
+                               0,
+                               HeroAt(index).Helmet()->HasIkari() ? HeroAt(index).Helmet()->GetIkari()->Name() : "");
+       } else {
+               ikariMenus[index].Add(res->noEquipmentText, 0, false, res->helmetMenuIcon);
+       }
+
+       if (HeroAt(index).HasRing()) {
+               ikariMenus[index].Add(
+                               HeroAt(index).Ring()->Name(),
+                               HeroAt(index).Ring(),
+                               HeroAt(index).Ring()->HasIkari() && HeroAt(index).Ring()->GetIkari()->Cost() <= HeroAt(index).IP(),
+                               res->ringMenuIcon,
+                               0,
+                               HeroAt(index).Ring()->HasIkari() ? HeroAt(index).Ring()->GetIkari()->Name() : "");
+       } else {
+               ikariMenus[index].Add(res->noEquipmentText, 0, false, res->ringMenuIcon);
+       }
+
+       if (HeroAt(index).HasJewel()) {
+               ikariMenus[index].Add(
+                               HeroAt(index).Jewel()->Name(),
+                               HeroAt(index).Jewel(),
+                               HeroAt(index).Jewel()->HasIkari() && HeroAt(index).Jewel()->GetIkari()->Cost() <= HeroAt(index).IP(),
+                               res->jewelMenuIcon,
+                               0,
+                               HeroAt(index).Jewel()->HasIkari() ? HeroAt(index).Jewel()->GetIkari()->Name() : "");
+       } else {
+               ikariMenus[index].Add(res->noEquipmentText, 0, false, res->jewelMenuIcon);
+       }
+}
+
 void BattleState::LoadInventory() {
        const Inventory &inv(*res->inventory);
        itemMenu.Clear();
index ff5b624dc69ab4176f176b2bd05d72869ad11806..93e1e2b032c82a666dcb5cd1bed79c997530d243 100644 (file)
@@ -123,6 +123,7 @@ public:
 
 private:
        void LoadSpellMenu(std::vector<Hero>::size_type heroIndex);
+       void LoadIkariMenu(std::vector<Hero>::size_type heroIndex);
        void LoadInventory();
 
 private:
index 26b9d0527033484ee594f72d7342b816b2d46898..4d448b62df6de2b824f85eac8f2dacf587857ec4 100644 (file)
@@ -27,12 +27,12 @@ class Menu {
 
 public:
        Menu();
-       Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap = 0, int iconSpace = 0, int cols = 1, int colGap = 0, int charsPerNumber = 0, char delimiter = ':');
+       Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap = 0, int iconSpace = 0, int cols = 1, int colGap = 0, int charsPerNumber = 0, char delimiter = ':', int charsPerAdditionalText = 0, int additionalTextGap = 0);
 
 public:
        int Width() const;
        int Height() const;
-       int ColWidth() const { return iconSpace + font->CharWidth() * (charsPerEntry + charsPerNumber) + (charsPerNumber ? font->CharWidth() : 0); }
+       int ColWidth() const;
        int RowHeight() const { return font->CharHeight() + rowGap; }
        int CharsPerEntry() const { return charsPerEntry; }
 
@@ -54,7 +54,7 @@ public:
        T &ValueAt(int index) { return entries[index].value; }
        const T &ValueAt(int index) const { return entries[index].value; }
 
-       void Add(const char *title, const T &value, bool enabled = true, const Sprite *icon = 0, int number = 0) { entries.push_back(Entry(title, value, enabled, icon, number)); }
+       void Add(const char *title, const T &value, bool enabled = true, const Sprite *icon = 0, int number = 0, const char *additionalText = 0) { entries.push_back(Entry(title, value, enabled, icon, number, additionalText)); }
        void AddEmptyEntry() { entries.push_back(Entry(0, T(), false)); }
        void Disable(int index) { entries[index].enabled = false; }
        void Enable(int index) { entries[index].enabled = true; }
@@ -69,9 +69,10 @@ private:
 
 private:
        struct Entry {
-               Entry(const char *title, const T &value, bool enabled = true, const Sprite *icon = 0, int number = 0)
-               : title(title), icon(icon), number(number), value(value), enabled(enabled) { }
+               Entry(const char *title, const T &value, bool enabled = true, const Sprite *icon = 0, int number = 0, const char *additionalText = 0)
+               : title(title), additionalText(additionalText), icon(icon), number(number), value(value), enabled(enabled) { }
                const char *title;
+               const char *additionalText;
                const Sprite *icon;
                int number;
                T value;
@@ -90,6 +91,8 @@ private:
        int selected;
        int topRow;
        int charsPerNumber;
+       int charsPerAdditionalText;
+       int additionalTextGap;
        char delimiter;
 
 };
@@ -109,12 +112,14 @@ Menu<T>::Menu()
 , selected(0)
 , topRow(0)
 , charsPerNumber(0)
+, charsPerAdditionalText(0)
+, additionalTextGap(0)
 , delimiter(':') {
 
 }
 
 template<class T>
-Menu<T>::Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap, int iconSpace, int cols, int colGap, int charsPerNumber, char delimiter)
+Menu<T>::Menu(const Font *font, const Font *disabledFont, const Sprite *cursor, int charsPerEntry, int rows, int rowGap, int iconSpace, int cols, int colGap, int charsPerNumber, char delimiter, int charsPerAdditionalText, int additionalTextGap)
 : font(font)
 , disabledFont(disabledFont ? disabledFont : font)
 , cursor(cursor)
@@ -127,11 +132,26 @@ Menu<T>::Menu(const Font *font, const Font *disabledFont, const Sprite *cursor,
 , selected(0)
 , topRow(0)
 , charsPerNumber(charsPerNumber)
+, charsPerAdditionalText(charsPerAdditionalText)
+, additionalTextGap(additionalTextGap)
 , delimiter(delimiter) {
 
 }
 
 
+template<class T>
+int Menu<T>::ColWidth() const {
+       int width(iconSpace);
+       width += font->CharWidth() * (charsPerEntry + charsPerNumber);
+       if (charsPerNumber) {
+               width += font->CharWidth();
+       }
+       if (charsPerAdditionalText) {
+               width += additionalTextGap + charsPerAdditionalText * font->CharWidth();
+       }
+       return width;
+}
+
 template<class T>
 int Menu<T>::Width() const {
        return cols * ColWidth() + (cols - 1) * colGap;
@@ -189,15 +209,24 @@ void Menu<T>::Draw(SDL_Surface *dest, geometry::Point<int> position) const {
                if (entries[start + i].icon) {
                        entries[start + i].icon->Draw(dest, position + iconOffset);
                }
-               geometry::Vector<int> labelOffset(iconOffset.X() + iconSpace, iconOffset.Y());
+               geometry::Vector<int> textOffset(iconOffset.X() + iconSpace, iconOffset.Y());
                const Font *usedFont(entries[start + i].enabled ? font : disabledFont);
-               usedFont->DrawString(entries[start + i].title, dest, position + labelOffset, charsPerEntry);
+               usedFont->DrawString(entries[start + i].title, dest, position + textOffset, charsPerEntry);
+
+               textOffset += geometry::Vector<int>(charsPerEntry * usedFont->CharWidth(), 0);
+
+               if (charsPerAdditionalText) {
+                       textOffset += geometry::Vector<int>(additionalTextGap, 0);
+                       if (entries[start + i].additionalText) {
+                               usedFont->DrawString(entries[start + i].additionalText, dest, position + textOffset, charsPerAdditionalText);
+                       }
+                       textOffset += geometry::Vector<int>(charsPerAdditionalText * usedFont->CharWidth(), 0);
+               }
 
                if (charsPerNumber) {
-                       geometry::Vector<int> delimiterOffset(labelOffset.X() + charsPerEntry * usedFont->CharWidth(), labelOffset.Y());
-                       usedFont->DrawChar(delimiter, dest, position + delimiterOffset);
-                       geometry::Vector<int> numberOffset(delimiterOffset.X() + usedFont->CharWidth(), delimiterOffset.Y());
-                       usedFont->DrawNumber(entries[start + i].number, dest, position + numberOffset);
+                       usedFont->DrawChar(delimiter, dest, position + textOffset);
+                       textOffset += geometry::Vector<int>(usedFont->CharWidth(), 0);
+                       usedFont->DrawNumber(entries[start + i].number, dest, position + textOffset);
                }
        }
        geometry::Vector<int> cursorOffset(
index 1d98f41cf89f9eed0db269df2a65d9f21963f0d7..3e223491aeb4a280f1f4874851a64573fd445188 100644 (file)
@@ -95,7 +95,7 @@ int main(int argc, char **argv) {
                maxim.SetHealth(33);
                maxim.SetMaxMana(20);
                maxim.SetMana(20);
-               maxim.SetIP(100);
+               maxim.SetIP(55);
 
                SDL_Surface *selanImg(IMG_Load("test-data/selan.png"));
                Sprite selanSprite(selanImg, 64, 64);
@@ -445,13 +445,7 @@ int main(int argc, char **argv) {
 
                battleRes.ikariMenuHeadline = "Please choose equipment.";
                battleRes.noEquipmentText = "No equip";
-               battleRes.ikariMenuPrototype = Menu<const Item *>(&normalFont, &disabledFont, &handCursorSprite, 26, 6, 8, 16, 1, 32);
-               battleRes.ikariMenuPrototype.Add("Zirco whip   Thundershriek", 0, false, &swordIcon);
-               battleRes.ikariMenuPrototype.Add("Zircon plate Sudden cure", 0, true, &armorIcon);
-               battleRes.ikariMenuPrototype.Add("Zirco gloves Forcefield", 0, true, &shieldIcon);
-               battleRes.ikariMenuPrototype.Add("Holy cap     Vulnerable", 0, false, &helmetIcon);
-               battleRes.ikariMenuPrototype.Add("Ghost ring   Destroy", 0, true, &ringIcon);
-               battleRes.ikariMenuPrototype.Add("Eagle rock   Dive", 0, true, &jewelIcon);
+               battleRes.ikariMenuPrototype = Menu<const Item *>(&normalFont, &disabledFont, &handCursorSprite, 12, 6, normalFont.CharHeight() / 2, normalFont.CharWidth(), 1, normalFont.CharWidth() * 2, 0, ':', 12, normalFont.CharWidth());
 
                BattleState *battleState(new BattleState(bg, monstersLayout, heroesLayout, &battleRes));
                battleState->AddMonster(monster);