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