]> git.localhorst.tv Git - l2e.git/blob - src/menu/StatusMenu.cpp
added ikari level to status menu
[l2e.git] / src / menu / StatusMenu.cpp
1 /*
2  * StatusMenu.cpp
3  *
4  *  Created on: Oct 22, 2012
5  *      Author: holy
6  */
7
8 #include "StatusMenu.h"
9
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"
21
22 using app::Input;
23 using common::Hero;
24 using common::Item;
25 using common::Stats;
26 using geometry::Vector;
27 using graphics::Font;
28
29 namespace menu {
30
31 StatusMenu::StatusMenu(PartyMenu *parent, int cursor)
32 : parent(parent)
33 , cursor(cursor) {
34
35 }
36
37
38 void StatusMenu::OnEnterState(SDL_Surface *) {
39
40 }
41
42 void StatusMenu::OnExitState(SDL_Surface *) {
43
44 }
45
46 void StatusMenu::OnResumeState(SDL_Surface *) {
47
48 }
49
50 void StatusMenu::OnPauseState(SDL_Surface *) {
51
52 }
53
54
55 void StatusMenu::OnResize(int width, int height) {
56
57 }
58
59
60 void StatusMenu::HandleEvents(const Input &input) {
61         if (input.JustPressed(Input::ACTION_B)) {
62                 Ctrl().PopState();
63         }
64
65         if (input.JustPressed(Input::SHOULDER_RIGHT)) {
66                 NextHero();
67         }
68         if (input.JustPressed(Input::SHOULDER_LEFT)) {
69                 PreviousHero();
70         }
71 }
72
73 void StatusMenu::UpdateWorld(float deltaT) {
74
75 }
76
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);
97
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);
106 }
107
108 int StatusMenu::Width() const {
109         return parent->Width();
110 }
111
112 int StatusMenu::Height() const {
113         return parent->Height();
114 }
115
116 void StatusMenu::RenderStatus(SDL_Surface *screen, const Vector<int> &offset) const {
117         parent->GetHeroStatus(cursor).Render(screen, offset);
118 }
119
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());
123
124         Vector<int> position(offset);
125         RenderStatsLine(parent->Res().atpLabel, stats.Attack(), screen, position);
126
127         position += lineBreak;
128         RenderStatsLine(parent->Res().dfpLabel, stats.Defense(), screen, position);
129
130         position += lineBreak;
131         RenderStatsLine(parent->Res().strLabel, stats.Strength(), screen, position);
132
133         position += lineBreak;
134         RenderStatsLine(parent->Res().aglLabel, stats.Agility(), screen, position);
135
136         position += lineBreak;
137         RenderStatsLine(parent->Res().intLabel, stats.Intelligence(), screen, position);
138
139         position += lineBreak;
140         RenderStatsLine(parent->Res().gutLabel, stats.Gut(), screen, position);
141
142         position += lineBreak;
143         RenderStatsLine(parent->Res().mgrLabel, stats.MagicResistance(), screen, position);
144 }
145
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);
149
150         font.DrawString(label, screen, position, 3);
151         font.DrawNumber(number, screen, position + numberOffset, 3);
152 }
153
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());
157
158         Vector<int> position(offset);
159         RenderEquipmentLine(hero.Weapon(), screen, position);
160
161         position += lineBreak;
162         RenderEquipmentLine(hero.Armor(), screen, position);
163
164         position += lineBreak;
165         RenderEquipmentLine(hero.Shield(), screen, position);
166
167         position += lineBreak;
168         RenderEquipmentLine(hero.Helmet(), screen, position);
169
170         position += lineBreak;
171         RenderEquipmentLine(hero.Ring(), screen, position);
172
173         position += lineBreak;
174         RenderEquipmentLine(hero.Jewel(), screen, position);
175 }
176
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);
180         if (item) {
181                 if (item->MenuIcon()) {
182                         item->MenuIcon()->Draw(screen, position);
183                 }
184                 font.DrawString(item->Name(), screen, position + textOffset);
185         } else {
186                 font.DrawString(parent->Res().noEquipmentText, screen, position + textOffset);
187         }
188 }
189
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);
193
194         Vector<int> numberOffset(offset.X(), offset.Y() + font.CharHeight());
195         font.DrawNumberRight(GetHero().Experience(), screen, numberOffset, 7);
196 }
197
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);
201
202         Vector<int> numberOffset(offset.X(), offset.Y() + font.CharHeight());
203         font.DrawNumberRight(GetHero().NextLevel(), screen, numberOffset, 7);
204 }
205
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);
209
210         Vector<int> numberOffset(offset.X() + 5 * font.CharWidth(), offset.Y());
211         font.DrawNumber(GetHero().RelativeIP(100), screen, numberOffset, 3);
212
213         Vector<int> percentOffset(offset.X() + 8 * font.CharWidth(), offset.Y());
214         font.DrawChar('%', screen, percentOffset);
215 }
216
217
218 void StatusMenu::NextHero() {
219         cursor = (cursor + 1) % parent->Game().state->partySize;
220 }
221
222 void StatusMenu::PreviousHero() {
223         cursor = (cursor + parent->Game().state->partySize - 1) % parent->Game().state->partySize;
224 }
225
226 const Hero &StatusMenu::GetHero() const {
227         return *parent->Game().state->party[cursor];
228 }
229
230 }