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