X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmenu%2FCapsuleMenu.cpp;h=dd61dbde091360378dafdde71572bf297f402e0c;hb=9666839d0ca6c794d28226a007870c82ef4ddb20;hp=c85091ba52102e43a899d4da4eb2ceee33d34fdd;hpb=10a8d3a83e7ad6815bc9f752922239ef32073a5e;p=l2e.git diff --git a/src/menu/CapsuleMenu.cpp b/src/menu/CapsuleMenu.cpp index c85091b..dd61dbd 100644 --- a/src/menu/CapsuleMenu.cpp +++ b/src/menu/CapsuleMenu.cpp @@ -1,11 +1,15 @@ #include "CapsuleMenu.h" +#include "CapsuleChangeMenu.h" +#include "CapsuleFeedMenu.h" +#include "CapsuleNameMenu.h" #include "PartyMenu.h" #include "Resources.h" #include "../app/Application.h" #include "../app/Input.h" #include "../common/GameConfig.h" #include "../common/GameState.h" +#include "../common/Spell.h" #include "../common/Stats.h" #include "../graphics/Font.h" #include "../graphics/Frame.h" @@ -22,10 +26,10 @@ namespace menu { CapsuleMenu::CapsuleMenu(PartyMenu *parent) : parent(parent) -, menu(*parent->Res().capsuleMenuProperties) { - menu.Add(parent->Res().capsuleFeedLabel, 0); - menu.Add(parent->Res().capsuleChangeLabel, 1); - menu.Add(parent->Res().capsuleNameLabel, 2); +, menu(*Res().capsuleMenuProperties) { + menu.Add(Res().capsuleFeedLabel, CHOICE_FEED); + menu.Add(Res().capsuleChangeLabel, CHOICE_CHANGE); + menu.Add(Res().capsuleNameLabel, CHOICE_NAME); } @@ -38,7 +42,7 @@ void CapsuleMenu::OnExitState(SDL_Surface *) { } void CapsuleMenu::OnResumeState(SDL_Surface *) { - + menu.SetActive(); } void CapsuleMenu::OnPauseState(SDL_Surface *) { @@ -52,7 +56,29 @@ void CapsuleMenu::OnResize(int width, int height) { void CapsuleMenu::HandleEvents(const Input &input) { - if (input.JustPressed(Input::ACTION_B)) { + if (input.JustPressed(Input::PAD_LEFT)) { + menu.PreviousItem(); + } + if (input.JustPressed(Input::PAD_RIGHT)) { + menu.NextItem(); + } + + if (input.JustPressed(Input::ACTION_A)) { + switch (menu.Selected()) { + case CHOICE_FEED: + Ctrl().PushState(new CapsuleFeedMenu(this)); + menu.SetSelected(); + break; + case CHOICE_CHANGE: + Ctrl().PushState(new CapsuleChangeMenu(this)); + menu.SetSelected(); + break; + case CHOICE_NAME: + Ctrl().PushState(new CapsuleNameMenu(this)); + menu.SetSelected(); + break; + } + } else if (input.JustPressed(Input::ACTION_B)) { Ctrl().PopState(); } } @@ -62,15 +88,170 @@ void CapsuleMenu::UpdateWorld(float deltaT) { } void CapsuleMenu::Render(SDL_Surface *screen) { - Vector offset((screen->w - Width()) / 2, (screen->h - Height()) / 2); + const Font &font(*Res().statusFont); + const Vector offset((screen->w - Width()) / 2, (screen->h - Height()) / 2); + const Vector capsuleOffset( + 6 * font.CharWidth(), + 12 * font.CharHeight()); + const Vector infoOffset( + 12 * font.CharWidth(), + 2 * font.CharHeight() - font.CharHeight() / 8); + // TODO: wheel offset: top left, center, or center bottom? + const Vector wheelOffset; + const Vector statsOffset( + 12 * font.CharWidth(), + 15 * font.CharHeight() - font.CharHeight() / 8); + const Vector menuOffset( + font.CharWidth(), + 24 * font.CharHeight() - font.CharHeight() / 8); RenderBackground(screen); + RenderCapsule(screen, offset + capsuleOffset); + RenderInfo(screen, offset + infoOffset); + RenderWheel(screen, offset + wheelOffset); + RenderStats(screen, offset + statsOffset); + RenderMenu(screen, offset + menuOffset); } void CapsuleMenu::RenderBackground(SDL_Surface *screen) const { - parent->Res().capsulebg->Render(screen, Vector(), Vector(screen->w, screen->h)); + Res().capsulebg->Render(screen, Vector(), Vector(screen->w, screen->h)); +} + +void CapsuleMenu::RenderCapsule(SDL_Surface *screen, const Vector &offset) const { + GetCapsule().BattleSprite()->DrawCenterBottom(screen, offset); +} + +void CapsuleMenu::RenderInfo(SDL_Surface *screen, const Vector &offset) const { + const Capsule &capsule(GetCapsule()); + const Font &font(*Res().statusFont); + const Vector delimiterOffset(5 * font.CharWidth(), 0); + const Vector valueOffset(6 * font.CharWidth(), 0); + const Vector lineBreak(0, font.CharHeight() + font.CharHeight() / 2); + Vector lineHead(offset); + + font.DrawString(Res().capsuleNameLabel, screen, lineHead, 5); + font.DrawChar(':', screen, lineHead + delimiterOffset); + font.DrawString(capsule.Name(), screen, lineHead + valueOffset); + + lineHead += lineBreak; + font.DrawString(Res().capsuleClassLabel, screen, lineHead, 5); + font.DrawChar(':', screen, lineHead + delimiterOffset); + font.DrawString(capsule.ClassName(), screen, lineHead + valueOffset); + + lineHead += lineBreak; + font.DrawString(Res().capsuleAlignmentLabel, screen, lineHead, 5); + font.DrawChar(':', screen, lineHead + delimiterOffset); + font.DrawString(capsule.Alignment(), screen, lineHead + valueOffset); + + lineHead += lineBreak; + font.DrawString(Res().capsuleTribeLabel, screen, lineHead, 5); + font.DrawChar(':', screen, lineHead + delimiterOffset); + font.DrawString(capsule.Tribe(), screen, lineHead + valueOffset); + + lineHead += lineBreak; + font.DrawString(Res().capsuleAttack1Label, screen, lineHead, 5); + font.DrawChar(':', screen, lineHead + delimiterOffset); + if (capsule.Attack1()) { + font.DrawString(capsule.Attack1()->Name(), screen, lineHead + valueOffset); + } else { + font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset); + } + + lineHead += lineBreak; + font.DrawString(Res().capsuleAttack1Label, screen, lineHead, 5); + font.DrawChar(':', screen, lineHead + delimiterOffset); + if (capsule.Attack2()) { + font.DrawString(capsule.Attack2()->Name(), screen, lineHead + valueOffset); + } else { + font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset); + } + + lineHead += lineBreak; + font.DrawString(Res().capsuleAttack1Label, screen, lineHead, 5); + font.DrawChar(':', screen, lineHead + delimiterOffset); + if (capsule.Attack3()) { + font.DrawString(capsule.Attack3()->Name(), screen, lineHead + valueOffset); + } else { + font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset); + } +} + +void CapsuleMenu::RenderWheel(SDL_Surface *screen, const Vector &offset) const { + // later +} + +void CapsuleMenu::RenderStats(SDL_Surface *screen, const Vector &offset) const { + const Capsule &capsule(GetCapsule()); + Stats stats(capsule.GetStats()); + const Font &font(*Res().statusFont); + const Vector lineBreak(0, font.CharHeight()); + Vector lineHead(offset); + + RenderStatsLine(screen, lineHead, Res().hpLabel, capsule.MaxHealth()); + lineHead += lineBreak; + RenderStatsLine(screen, lineHead, Res().atpLabel, stats.Attack()); + lineHead += lineBreak; + RenderStatsLine(screen, lineHead, Res().dfpLabel, stats.Defense()); + lineHead += lineBreak; + RenderStatsLine(screen, lineHead, Res().strLabel, stats.Strength()); + lineHead += lineBreak; + RenderStatsLine(screen, lineHead, Res().aglLabel, stats.Agility()); + lineHead += lineBreak; + RenderStatsLine(screen, lineHead, Res().intLabel, stats.Intelligence()); + lineHead += lineBreak; + RenderStatsLine(screen, lineHead, Res().gutLabel, stats.Gut()); + lineHead += lineBreak; + RenderStatsLine(screen, lineHead, Res().mgrLabel, stats.MagicResistance()); + + lineHead = offset + Vector(18 * font.CharWidth(), 0); + font.DrawStringRight(Res().levelLabel, screen, lineHead); + lineHead += lineBreak; + font.DrawNumberRight(capsule.Level(), screen, lineHead); + lineHead += 2 * lineBreak; + font.DrawStringRight(Res().experienceLabel, screen, lineHead); + lineHead += lineBreak; + font.DrawNumberRight(capsule.Experience(), screen, lineHead); + lineHead += 2 * lineBreak; + font.DrawStringRight(Res().nextLevelLabel, screen, lineHead); + lineHead += lineBreak; + font.DrawNumberRight(capsule.NextLevel(), screen, lineHead); +} + +void CapsuleMenu::RenderStatsLine(SDL_Surface *screen, const geometry::Vector &offset, const char *name, int value) const { + const Font &font(*Res().statusFont); + const Vector numberOffset(4 * font.CharWidth(), 0); + + font.DrawString(name, screen, offset, 4); + font.DrawNumber(value, screen, offset + numberOffset, 3); } +void CapsuleMenu::RenderMenu(SDL_Surface *screen, const Vector &offset) const { + const Font &font(*Res().normalFont); + const Frame &frame(*Res().statusFrame); + const Vector menuOffset(3 * font.CharWidth(), font.CharHeight()); + + frame.Draw(screen, offset, 30 * font.CharWidth(), 3 * font.CharHeight()); + menu.Draw(screen, offset + menuOffset); +} + + +common::GameConfig &CapsuleMenu::Game() { + return parent->Game(); +} + +const common::GameConfig &CapsuleMenu::Game() const { + return parent->Game(); +} + +Resources &CapsuleMenu::Res() { + return parent->Res(); +} + +const Resources &CapsuleMenu::Res() const { + return parent->Res(); +} + + int CapsuleMenu::Width() const { return parent->Width(); } @@ -79,8 +260,12 @@ int CapsuleMenu::Height() const { return parent->Height(); } +Capsule &CapsuleMenu::GetCapsule() { + return *Game().state->capsule; +} + const Capsule &CapsuleMenu::GetCapsule() const { - return *parent->Game().state->capsule; + return *Game().state->capsule; } }