4 * Created on: Oct 22, 2012
8 #include "StatusMenu.h"
10 #include "HeroStatus.h"
11 #include "PartyMenu.h"
12 #include "Resources.h"
13 #include "../app/Application.h"
14 #include "../app/Input.h"
15 #include "../common/GameConfig.h"
16 #include "../common/GameState.h"
17 #include "../common/Hero.h"
18 #include "../common/Item.h"
19 #include "../common/Stats.h"
20 #include "../graphics/Font.h"
26 using geometry::Vector;
31 StatusMenu::StatusMenu(PartyMenu *parent, int cursor)
38 void StatusMenu::OnEnterState(SDL_Surface *) {
42 void StatusMenu::OnExitState(SDL_Surface *) {
46 void StatusMenu::OnResumeState(SDL_Surface *) {
50 void StatusMenu::OnPauseState(SDL_Surface *) {
55 void StatusMenu::OnResize(int width, int height) {
60 void StatusMenu::HandleEvents(const Input &input) {
61 if (input.JustPressed(Input::ACTION_B)) {
65 if (input.JustPressed(Input::SHOULDER_RIGHT)) {
68 if (input.JustPressed(Input::SHOULDER_LEFT)) {
73 void StatusMenu::UpdateWorld(float deltaT) {
77 void StatusMenu::Render(SDL_Surface *screen) {
78 Vector<int> offset((screen->w - Width()) / 2, (screen->h - Height()) / 2);
79 Vector<int> shoulderNavOffset(
80 5 * parent->Res().statusFont->CharWidth(),
81 parent->Res().statusFont->CharHeight());
82 Vector<int> statsOffset(
83 4 * parent->Res().statusFont->CharWidth(),
84 8 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8);
85 Vector<int> equipOffset(
86 17 * parent->Res().statusFont->CharWidth(),
87 4 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8);
88 Vector<int> experienceOffset(
89 11 * parent->Res().statusFont->CharWidth(),
90 17 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8);
91 Vector<int> nextLevelOffset(
92 11 * parent->Res().statusFont->CharWidth(),
93 19 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8);
94 Vector<int> ikariOffset(
95 17 * parent->Res().statusFont->CharWidth(),
96 17 * parent->Res().statusFont->CharHeight() - parent->Res().statusFont->CharHeight() / 8);
98 parent->RenderBackground(screen);
99 parent->Res().shoulderNav->Draw(screen, offset + shoulderNavOffset);
100 RenderStatus(screen, offset + parent->StatusOffset(0));
101 RenderStats(screen, offset + statsOffset);
102 RenderEquipment(screen, offset + equipOffset);
103 RenderExperience(screen, experienceOffset);
104 RenderNextLevel(screen, nextLevelOffset);
105 RenderIkari(screen, ikariOffset);
108 int StatusMenu::Width() const {
109 return parent->Width();
112 int StatusMenu::Height() const {
113 return parent->Height();
116 void StatusMenu::RenderStatus(SDL_Surface *screen, const Vector<int> &offset) const {
117 parent->GetHeroStatus(cursor).Render(screen, offset);
120 void StatusMenu::RenderStats(SDL_Surface *screen, const Vector<int> &offset) const {
121 const Stats &stats(GetHero().GetStats());
122 Vector<int> lineBreak(0, parent->Res().statusFont->CharHeight());
124 Vector<int> position(offset);
125 RenderStatsLine(parent->Res().atpLabel, stats.Attack(), screen, position);
127 position += lineBreak;
128 RenderStatsLine(parent->Res().dfpLabel, stats.Defense(), screen, position);
130 position += lineBreak;
131 RenderStatsLine(parent->Res().strLabel, stats.Strength(), screen, position);
133 position += lineBreak;
134 RenderStatsLine(parent->Res().aglLabel, stats.Agility(), screen, position);
136 position += lineBreak;
137 RenderStatsLine(parent->Res().intLabel, stats.Intelligence(), screen, position);
139 position += lineBreak;
140 RenderStatsLine(parent->Res().gutLabel, stats.Gut(), screen, position);
142 position += lineBreak;
143 RenderStatsLine(parent->Res().mgrLabel, stats.MagicResistance(), screen, position);
146 void StatusMenu::RenderStatsLine(const char *label, int number, SDL_Surface *screen, const Vector<int> &position) const {
147 const Font &font(*parent->Res().statusFont);
148 const Vector<int> numberOffset(4 * font.CharWidth(), 0);
150 font.DrawString(label, screen, position, 3);
151 font.DrawNumber(number, screen, position + numberOffset, 3);
154 void StatusMenu::RenderEquipment(SDL_Surface *screen, const Vector<int> &offset) const {
155 const Hero &hero(GetHero());
156 Vector<int> lineBreak(0, 2 * parent->Res().statusFont->CharHeight());
158 Vector<int> position(offset);
159 RenderEquipmentLine(hero.Weapon(), screen, position);
161 position += lineBreak;
162 RenderEquipmentLine(hero.Armor(), screen, position);
164 position += lineBreak;
165 RenderEquipmentLine(hero.Shield(), screen, position);
167 position += lineBreak;
168 RenderEquipmentLine(hero.Helmet(), screen, position);
170 position += lineBreak;
171 RenderEquipmentLine(hero.Ring(), screen, position);
173 position += lineBreak;
174 RenderEquipmentLine(hero.Jewel(), screen, position);
177 void StatusMenu::RenderEquipmentLine(const Item *item, SDL_Surface *screen, const Vector<int> &position) const {
178 const Font &font(*parent->Res().statusFont);
179 const Vector<int> textOffset(font.CharWidth(), 0);
181 if (item->MenuIcon()) {
182 item->MenuIcon()->Draw(screen, position);
184 font.DrawString(item->Name(), screen, position + textOffset);
186 font.DrawString(parent->Res().noEquipmentText, screen, position + textOffset);
190 void StatusMenu::RenderExperience(SDL_Surface *screen, const geometry::Vector<int> &offset) const {
191 const Font &font(*parent->Res().statusFont);
192 font.DrawStringRight(parent->Res().experienceLabel, screen, offset, 10);
194 Vector<int> numberOffset(offset.X(), offset.Y() + font.CharHeight());
195 font.DrawNumberRight(GetHero().Experience(), screen, numberOffset, 7);
198 void StatusMenu::RenderNextLevel(SDL_Surface *screen, const geometry::Vector<int> &offset) const {
199 const Font &font(*parent->Res().statusFont);
200 font.DrawStringRight(parent->Res().nextLevelLabel, screen, offset, 10);
202 Vector<int> numberOffset(offset.X(), offset.Y() + font.CharHeight());
203 font.DrawNumberRight(GetHero().NextLevel(), screen, numberOffset, 7);
206 void StatusMenu::RenderIkari(SDL_Surface *screen, const geometry::Vector<int> &offset) const {
207 const Font &font(*parent->Res().statusFont);
208 font.DrawString(parent->Res().ipLabel, screen, offset, 5);
210 Vector<int> numberOffset(offset.X() + 5 * font.CharWidth(), offset.Y());
211 font.DrawNumber(GetHero().RelativeIP(100), screen, numberOffset, 3);
213 Vector<int> percentOffset(offset.X() + 8 * font.CharWidth(), offset.Y());
214 font.DrawChar('%', screen, percentOffset);
218 void StatusMenu::NextHero() {
219 cursor = (cursor + 1) % parent->Game().state->partySize;
222 void StatusMenu::PreviousHero() {
223 cursor = (cursor + parent->Game().state->partySize - 1) % parent->Game().state->partySize;
226 const Hero &StatusMenu::GetHero() const {
227 return *parent->Game().state->party[cursor];