1 #include "CapsuleMenu.h"
3 #include "CapsuleChangeMenu.h"
4 #include "CapsuleFeedMenu.h"
5 #include "CapsuleNameMenu.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"
20 using common::Capsule;
24 using graphics::Frame;
28 CapsuleMenu::CapsuleMenu(PartyMenu *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);
37 void CapsuleMenu::OnEnterState(SDL_Surface *) {
38 menu.StartAnimation(Ctrl());
41 void CapsuleMenu::OnExitState(SDL_Surface *) {
45 void CapsuleMenu::OnResumeState(SDL_Surface *) {
49 void CapsuleMenu::OnPauseState(SDL_Surface *) {
54 void CapsuleMenu::OnResize(int width, int height) {
59 void CapsuleMenu::HandleEvents(const Input &input) {
60 if (input.JustPressed(Input::PAD_LEFT)) {
63 if (input.JustPressed(Input::PAD_RIGHT)) {
67 if (input.JustPressed(Input::ACTION_A)) {
68 switch (menu.Selected()) {
70 Ctrl().PushState(new CapsuleFeedMenu(this));
74 Ctrl().PushState(new CapsuleChangeMenu(this));
78 Ctrl().PushState(new CapsuleNameMenu(this));
82 } else if (input.JustPressed(Input::ACTION_B)) {
87 void CapsuleMenu::UpdateWorld(Uint32 deltaT) {
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(
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(
109 24 * font.CharHeight() - font.CharHeight() / 8);
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);
119 void CapsuleMenu::RenderBackground(SDL_Surface *screen) const {
120 Res().capsulebg->Render(screen, Vector<int>(), Vector<int>(screen->w, screen->h));
123 void CapsuleMenu::RenderCapsule(SDL_Surface *screen, const Vector<int> &offset) const {
124 GetCapsule().BattleSprite()->DrawCenterBottom(screen, offset);
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);
135 font.DrawString(Res().capsuleNameLabel, screen, lineHead, 5);
136 font.DrawChar(':', screen, lineHead + delimiterOffset);
137 font.DrawString(capsule.Name(), screen, lineHead + valueOffset);
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);
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);
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);
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);
160 font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset);
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);
169 font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset);
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);
178 font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset);
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());
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);
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());
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);
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);
228 font.DrawString(name, screen, offset, 4);
229 font.DrawNumber(value, screen, offset + numberOffset, 3);
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());
237 frame.Draw(screen, offset, 30 * font.CharWidth(), 3 * font.CharHeight());
238 menu.Draw(screen, offset + menuOffset);
242 common::GameConfig &CapsuleMenu::Game() {
243 return parent->Game();
246 const common::GameConfig &CapsuleMenu::Game() const {
247 return parent->Game();
250 Resources &CapsuleMenu::Res() {
251 return parent->Res();
254 const Resources &CapsuleMenu::Res() const {
255 return parent->Res();
259 int CapsuleMenu::Width() const {
260 return parent->Width();
263 int CapsuleMenu::Height() const {
264 return parent->Height();
267 Capsule &CapsuleMenu::GetCapsule() {
268 return Game().state->GetCapsule();
271 const Capsule &CapsuleMenu::GetCapsule() const {
272 return Game().state->GetCapsule();