]> git.localhorst.tv Git - l2e.git/blobdiff - src/battle/BattleState.cpp
added and implemented swap heroes state
[l2e.git] / src / battle / BattleState.cpp
index da3dad6de234f43263860d1e5b3dfdb85e16ea95..cbea81a82cb5d1564344abe6e24d757bbca70d0e 100644 (file)
 #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"
 #include "../geometry/operators.h"
 #include "../graphics/Sprite.h"
 
+#include <algorithm>
 #include <stdexcept>
 
 using app::Application;
@@ -46,6 +48,11 @@ void BattleState::AddHero(const Hero &h) {
        heroes.push_back(h);
 }
 
+void BattleState::SwapHeroes(std::vector<Hero>::size_type lhs, std::vector<Hero>::size_type rhs) {
+       if (lhs < 0 || lhs >= heroes.size() || rhs < 0 || rhs >= heroes.size() || lhs == rhs) return;
+       std::swap(heroes[lhs], heroes[rhs]);
+}
+
 
 void BattleState::Resize(int w, int h) {
 
@@ -59,8 +66,8 @@ 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
-               heroTags[i] = HeroTag(&heroes[i], attackChoices + i, res, HeroTag::Alignment((i + 1) % 2));
+               LoadIkariMenu(i);
+               heroTags[i] = HeroTag(this, i);
        }
 
        int tagHeight(attackTypeMenu.Height());
@@ -84,6 +91,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();