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