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