#include "../common/Item.h"
#include "../common/Stats.h"
#include "../graphics/Font.h"
+#include "../graphics/Frame.h"
using app::Input;
using common::Hero;
using common::Stats;
using geometry::Vector;
using graphics::Font;
+using graphics::Frame;
namespace menu {
StatusMenu::StatusMenu(PartyMenu *parent, int cursor)
: parent(parent)
-, cursor(cursor) {
-
+, cursor(cursor)
+, menu(*parent->Res().statusMenuProperties) {
+ menu.Add(parent->Res().nextLabel, 0);
+ menu.Add(parent->Res().returnLabel, 1);
}
void StatusMenu::HandleEvents(const Input &input) {
- if (input.JustPressed(Input::ACTION_B)) {
- Ctrl().PopState();
- }
-
if (input.JustPressed(Input::SHOULDER_RIGHT)) {
NextHero();
}
if (input.JustPressed(Input::SHOULDER_LEFT)) {
PreviousHero();
}
+
+ if (input.JustPressed(Input::PAD_LEFT)) {
+ menu.PreviousItem();
+ }
+ if (input.JustPressed(Input::PAD_RIGHT)) {
+ menu.NextItem();
+ }
+
+ if (input.JustPressed(Input::ACTION_A)) {
+ if (menu.Selected() == 0) {
+ NextHero();
+ } else if (menu.Selected() == 1) {
+ Ctrl().PopState();
+ }
+ }
+ if (input.JustPressed(Input::ACTION_B)) {
+ Ctrl().PopState();
+ }
}
void StatusMenu::UpdateWorld(float deltaT) {
17 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8);
Vector<int> nextLevelOffset(
11 * parent->Res().statusFont->CharWidth(),
- 19 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8);
+ 20 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8);
+ Vector<int> ikariOffset(
+ 17 * parent->Res().statusFont->CharWidth(),
+ 17 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8);
+ Vector<int> menuOffset(
+ parent->Res().statusFont->CharWidth(),
+ 23 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8);
parent->RenderBackground(screen);
parent->Res().shoulderNav->Draw(screen, offset + shoulderNavOffset);
RenderEquipment(screen, offset + equipOffset);
RenderExperience(screen, experienceOffset);
RenderNextLevel(screen, nextLevelOffset);
+ RenderIkari(screen, ikariOffset);
+ RenderMenu(screen, menuOffset);
}
int StatusMenu::Width() const {
Vector<int> lineBreak(0, 2 * parent->Res().statusFont->CharHeight());
Vector<int> position(offset);
- RenderEquipmentLine(hero.Weapon(), screen, position);
-
- position += lineBreak;
- RenderEquipmentLine(hero.Armor(), screen, position);
-
- position += lineBreak;
- RenderEquipmentLine(hero.Shield(), screen, position);
-
- position += lineBreak;
- RenderEquipmentLine(hero.Helmet(), screen, position);
-
- position += lineBreak;
- RenderEquipmentLine(hero.Ring(), screen, position);
-
- position += lineBreak;
- RenderEquipmentLine(hero.Jewel(), screen, position);
+ for (int i = 0; i < Hero::EQUIP_COUNT; ++i) {
+ RenderEquipmentLine(hero.Equipment(Hero::EquipSlot(i)), screen, position);
+ position += lineBreak;
+ }
}
void StatusMenu::RenderEquipmentLine(const Item *item, SDL_Surface *screen, const Vector<int> &position) const {
font.DrawNumberRight(GetHero().NextLevel(), screen, numberOffset, 7);
}
+void StatusMenu::RenderIkari(SDL_Surface *screen, const geometry::Vector<int> &offset) const {
+ const Font &font(*parent->Res().statusFont);
+ font.DrawString(parent->Res().ipLabel, screen, offset, 5);
+
+ Vector<int> numberOffset(offset.X() + 5 * font.CharWidth(), offset.Y());
+ font.DrawNumber(GetHero().RelativeIP(100), screen, numberOffset, 3);
+
+ Vector<int> percentOffset(offset.X() + 8 * font.CharWidth(), offset.Y());
+ font.DrawChar('%', screen, percentOffset);
+}
+
+void StatusMenu::RenderMenu(SDL_Surface *screen, const geometry::Vector<int> &offset) const {
+ const Font &font(*parent->Res().normalFont);
+ const Frame &frame(*parent->Res().statusFrame);
+
+ Vector<int> labelOffset(2 * font.CharWidth(), font.CharHeight());
+ frame.Draw(screen, offset, 10 * font.CharWidth(), 3 * font.CharHeight());
+ font.DrawString(parent->Res().mainMenuStatusText, screen, offset + labelOffset);
+
+ Vector<int> menuFrameOffset(10 * font.CharWidth(), 0);
+ Vector<int> menuOffset(13 * font.CharWidth(), font.CharHeight());
+ frame.Draw(screen, offset + menuFrameOffset, 20 * font.CharWidth(), 3 * font.CharHeight());
+ menu.Draw(screen, offset + menuOffset);
+}
+
void StatusMenu::NextHero() {
cursor = (cursor + 1) % parent->Game().state->partySize;