X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fbattle%2FBattleState.cpp;h=3f734f84d8ce5bc868f15ad8ea041f2439fce99b;hb=46d0e57f7823eaf07208fd5e0bdbd1e88b035382;hp=ad225173fce209625a452265c0913cf5b1d9adda;hpb=3c72a71fbf6de96333a641051a20c6bf8b3a5df3;p=l2e.git diff --git a/src/battle/BattleState.cpp b/src/battle/BattleState.cpp index ad22517..3f734f8 100644 --- a/src/battle/BattleState.cpp +++ b/src/battle/BattleState.cpp @@ -11,8 +11,10 @@ #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" @@ -22,6 +24,7 @@ using app::Application; using app::Input; using common::Inventory; using common::Item; +using common::Spell; using geometry::Point; using geometry::Vector; using graphics::Menu; @@ -55,9 +58,9 @@ void BattleState::EnterState(Application &ctrl, SDL_Surface *screen) { heroesLayout->CalculatePositions(background->w, background->h, heroesPositions); for (vector::size_type i(0), end(heroes.size()); i < end; ++i) { spellMenus.push_back(res->spellMenuPrototype); - // TODO: insert spell menu entries + 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)); } @@ -69,11 +72,96 @@ void BattleState::EnterState(Application &ctrl, SDL_Surface *screen) { heroTagPositions[2] = Point(xOffset, BackgroundHeight() - tagHeight); heroTagPositions[3] = Point(xOffset + tagWidth, BackgroundHeight() - tagHeight); - // TODO: insert item menu entries itemMenu = res->itemMenuPrototype; LoadInventory(); } +void BattleState::LoadSpellMenu(vector::size_type index) { + spellMenus[index].Clear(); + spellMenus[index].Reserve(HeroAt(index).Spells().size()); + for (vector::const_iterator i(HeroAt(index).Spells().begin()), end(HeroAt(index).Spells().end()); i != end; ++i) { + bool enabled((*i)->CanUseInBattle() && (*i)->Cost() <= HeroAt(index).Mana()); + spellMenus[index].Add((*i)->Name(), *i, enabled, 0, (*i)->Cost()); + } +} + +void BattleState::LoadIkariMenu(vector::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();