]> git.localhorst.tv Git - l2e.git/blob - src/menu/CapsuleMenu.cpp
removed lazy fwd headers
[l2e.git] / src / menu / CapsuleMenu.cpp
1 #include "CapsuleMenu.h"
2
3 #include "CapsuleChangeMenu.h"
4 #include "CapsuleFeedMenu.h"
5 #include "CapsuleNameMenu.h"
6 #include "PartyMenu.h"
7 #include "Resources.h"
8 #include "../app/Application.h"
9 #include "../app/Input.h"
10 #include "../common/GameConfig.h"
11 #include "../common/GameState.h"
12 #include "../common/Spell.h"
13 #include "../common/Stats.h"
14 #include "../graphics/Font.h"
15 #include "../graphics/Frame.h"
16 #include "../graphics/Texture.h"
17 #include "../math/Vector.h"
18
19 using app::Input;
20 using common::Capsule;
21 using common::Stats;
22 using math::Vector;
23 using graphics::Font;
24 using graphics::Frame;
25
26 namespace menu {
27
28 CapsuleMenu::CapsuleMenu(PartyMenu *parent)
29 : parent(parent)
30 , menu(*Res().capsuleMenuProperties) {
31         menu.Add(Res().capsuleFeedLabel, CHOICE_FEED);
32         menu.Add(Res().capsuleChangeLabel, CHOICE_CHANGE);
33         menu.Add(Res().capsuleNameLabel, CHOICE_NAME);
34 }
35
36
37 void CapsuleMenu::OnEnterState(SDL_Surface *) {
38
39 }
40
41 void CapsuleMenu::OnExitState(SDL_Surface *) {
42
43 }
44
45 void CapsuleMenu::OnResumeState(SDL_Surface *) {
46         menu.SetActive();
47 }
48
49 void CapsuleMenu::OnPauseState(SDL_Surface *) {
50
51 }
52
53
54 void CapsuleMenu::OnResize(int width, int height) {
55
56 }
57
58
59 void CapsuleMenu::HandleEvents(const Input &input) {
60         if (input.JustPressed(Input::PAD_LEFT)) {
61                 menu.PreviousItem();
62         }
63         if (input.JustPressed(Input::PAD_RIGHT)) {
64                 menu.NextItem();
65         }
66
67         if (input.JustPressed(Input::ACTION_A)) {
68                 switch (menu.Selected()) {
69                         case CHOICE_FEED:
70                                 Ctrl().PushState(new CapsuleFeedMenu(this));
71                                 menu.SetSelected();
72                                 break;
73                         case CHOICE_CHANGE:
74                                 Ctrl().PushState(new CapsuleChangeMenu(this));
75                                 menu.SetSelected();
76                                 break;
77                         case CHOICE_NAME:
78                                 Ctrl().PushState(new CapsuleNameMenu(this));
79                                 menu.SetSelected();
80                                 break;
81                 }
82         } else if (input.JustPressed(Input::ACTION_B)) {
83                 Ctrl().PopState();
84         }
85 }
86
87 void CapsuleMenu::UpdateWorld(Uint32 deltaT) {
88
89 }
90
91 void CapsuleMenu::Render(SDL_Surface *screen) {
92         const Font &font(*Res().statusFont);
93         const Vector<int> offset((screen->w - Width()) / 2, (screen->h - Height()) / 2);
94         const Vector<int> capsuleOffset(
95                         6 * font.CharWidth(),
96                         12 * font.CharHeight());
97         const Vector<int> infoOffset(
98                         12 * font.CharWidth(),
99                         2 * font.CharHeight() - font.CharHeight() / 8);
100         // TODO: wheel offset: top left, center, or center bottom?
101         const Vector<int> wheelOffset(
102                         6 * font.CharWidth(),
103                         19 * font.CharHeight() - font.CharHeight() / 8);
104         const Vector<int> statsOffset(
105                         12 * font.CharWidth(),
106                         15 * font.CharHeight() - font.CharHeight() / 8);
107         const Vector<int> menuOffset(
108                                 font.CharWidth(),
109                                 24 * font.CharHeight() - font.CharHeight() / 8);
110
111         RenderBackground(screen);
112         RenderCapsule(screen, offset + capsuleOffset);
113         RenderInfo(screen, offset + infoOffset);
114         RenderWheel(screen, offset + wheelOffset);
115         RenderStats(screen, offset + statsOffset);
116         RenderMenu(screen, offset + menuOffset);
117 }
118
119 void CapsuleMenu::RenderBackground(SDL_Surface *screen) const {
120         Res().capsulebg->Render(screen, Vector<int>(), Vector<int>(screen->w, screen->h));
121 }
122
123 void CapsuleMenu::RenderCapsule(SDL_Surface *screen, const Vector<int> &offset) const {
124         GetCapsule().BattleSprite()->DrawCenterBottom(screen, offset);
125 }
126
127 void CapsuleMenu::RenderInfo(SDL_Surface *screen, const Vector<int> &offset) const {
128         const Capsule &capsule(GetCapsule());
129         const Font &font(*Res().statusFont);
130         const Vector<int> delimiterOffset(5 * font.CharWidth(), 0);
131         const Vector<int> valueOffset(6 * font.CharWidth(), 0);
132         const Vector<int> lineBreak(0, font.CharHeight() + font.CharHeight() / 2);
133         Vector<int> lineHead(offset);
134
135         font.DrawString(Res().capsuleNameLabel, screen, lineHead, 5);
136         font.DrawChar(':', screen, lineHead + delimiterOffset);
137         font.DrawString(capsule.Name(), screen, lineHead + valueOffset);
138
139         lineHead += lineBreak;
140         font.DrawString(Res().capsuleClassLabel, screen, lineHead, 5);
141         font.DrawChar(':', screen, lineHead + delimiterOffset);
142         font.DrawString(capsule.ClassName(), screen, lineHead + valueOffset);
143
144         lineHead += lineBreak;
145         font.DrawString(Res().capsuleAlignmentLabel, screen, lineHead, 5);
146         font.DrawChar(':', screen, lineHead + delimiterOffset);
147         font.DrawString(capsule.Alignment(), screen, lineHead + valueOffset);
148
149         lineHead += lineBreak;
150         font.DrawString(Res().capsuleTribeLabel, screen, lineHead, 5);
151         font.DrawChar(':', screen, lineHead + delimiterOffset);
152         font.DrawString(capsule.Tribe(), screen, lineHead + valueOffset);
153
154         lineHead += lineBreak;
155         font.DrawString(Res().capsuleAttack1Label, screen, lineHead, 5);
156         font.DrawChar(':', screen, lineHead + delimiterOffset);
157         if (capsule.Attack1()) {
158                 font.DrawString(capsule.Attack1()->Name(), screen, lineHead + valueOffset);
159         } else {
160                 font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset);
161         }
162
163         lineHead += lineBreak;
164         font.DrawString(Res().capsuleAttack1Label, screen, lineHead, 5);
165         font.DrawChar(':', screen, lineHead + delimiterOffset);
166         if (capsule.Attack2()) {
167                 font.DrawString(capsule.Attack2()->Name(), screen, lineHead + valueOffset);
168         } else {
169                 font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset);
170         }
171
172         lineHead += lineBreak;
173         font.DrawString(Res().capsuleAttack1Label, screen, lineHead, 5);
174         font.DrawChar(':', screen, lineHead + delimiterOffset);
175         if (capsule.Attack3()) {
176                 font.DrawString(capsule.Attack3()->Name(), screen, lineHead + valueOffset);
177         } else {
178                 font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset);
179         }
180 }
181
182 void CapsuleMenu::RenderWheel(SDL_Surface *screen, const Vector<int> &offset) const {
183         Res().capsuleAlignmentWheel->DrawCenter(screen, offset);
184         Res().capsuleAlignmentCursor->DrawCenter(screen, offset + Game().state->GetCapsule().AlignmentOffset());
185 }
186
187 void CapsuleMenu::RenderStats(SDL_Surface *screen, const Vector<int> &offset) const {
188         const Capsule &capsule(GetCapsule());
189         Stats stats(capsule.GetStats());
190         const Font &font(*Res().statusFont);
191         const Vector<int> lineBreak(0, font.CharHeight());
192         Vector<int> lineHead(offset);
193
194         RenderStatsLine(screen, lineHead, Res().hpLabel, capsule.MaxHealth());
195         lineHead += lineBreak;
196         RenderStatsLine(screen, lineHead, Res().atpLabel, stats.Attack());
197         lineHead += lineBreak;
198         RenderStatsLine(screen, lineHead, Res().dfpLabel, stats.Defense());
199         lineHead += lineBreak;
200         RenderStatsLine(screen, lineHead, Res().strLabel, stats.Strength());
201         lineHead += lineBreak;
202         RenderStatsLine(screen, lineHead, Res().aglLabel, stats.Agility());
203         lineHead += lineBreak;
204         RenderStatsLine(screen, lineHead, Res().intLabel, stats.Intelligence());
205         lineHead += lineBreak;
206         RenderStatsLine(screen, lineHead, Res().gutLabel, stats.Gut());
207         lineHead += lineBreak;
208         RenderStatsLine(screen, lineHead, Res().mgrLabel, stats.MagicResistance());
209
210         lineHead = offset + Vector<int>(18 * font.CharWidth(), 0);
211         font.DrawStringRight(Res().levelLabel, screen, lineHead);
212         lineHead += lineBreak;
213         font.DrawNumberRight(capsule.Level(), screen, lineHead);
214         lineHead += 2 * lineBreak;
215         font.DrawStringRight(Res().experienceLabel, screen, lineHead);
216         lineHead += lineBreak;
217         font.DrawNumberRight(capsule.Experience(), screen, lineHead);
218         lineHead += 2 * lineBreak;
219         font.DrawStringRight(Res().nextLevelLabel, screen, lineHead);
220         lineHead += lineBreak;
221         font.DrawNumberRight(capsule.NextLevel(), screen, lineHead);
222 }
223
224 void CapsuleMenu::RenderStatsLine(SDL_Surface *screen, const math::Vector<int> &offset, const char *name, int value) const {
225         const Font &font(*Res().statusFont);
226         const Vector<int> numberOffset(4 * font.CharWidth(), 0);
227
228         font.DrawString(name, screen, offset, 4);
229         font.DrawNumber(value, screen, offset + numberOffset, 3);
230 }
231
232 void CapsuleMenu::RenderMenu(SDL_Surface *screen, const Vector<int> &offset) const {
233         const Font &font(*Res().normalFont);
234         const Frame &frame(*Res().statusFrame);
235         const Vector<int> menuOffset(3 * font.CharWidth(), font.CharHeight());
236
237         frame.Draw(screen, offset, 30 * font.CharWidth(), 3 * font.CharHeight());
238         menu.Draw(screen, offset + menuOffset);
239 }
240
241
242 common::GameConfig &CapsuleMenu::Game() {
243         return parent->Game();
244 }
245
246 const common::GameConfig &CapsuleMenu::Game() const {
247         return parent->Game();
248 }
249
250 Resources &CapsuleMenu::Res() {
251         return parent->Res();
252 }
253
254 const Resources &CapsuleMenu::Res() const {
255         return parent->Res();
256 }
257
258
259 int CapsuleMenu::Width() const {
260         return parent->Width();
261 }
262
263 int CapsuleMenu::Height() const {
264         return parent->Height();
265 }
266
267 Capsule &CapsuleMenu::GetCapsule() {
268         return Game().state->GetCapsule();
269 }
270
271 const Capsule &CapsuleMenu::GetCapsule() const {
272         return Game().state->GetCapsule();
273 }
274
275 }