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"
19 using common::Capsule;
21 using geometry::Vector;
23 using graphics::Frame;
27 CapsuleMenu::CapsuleMenu(PartyMenu *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);
36 void CapsuleMenu::OnEnterState(SDL_Surface *) {
40 void CapsuleMenu::OnExitState(SDL_Surface *) {
44 void CapsuleMenu::OnResumeState(SDL_Surface *) {
48 void CapsuleMenu::OnPauseState(SDL_Surface *) {
53 void CapsuleMenu::OnResize(int width, int height) {
58 void CapsuleMenu::HandleEvents(const Input &input) {
59 if (input.JustPressed(Input::PAD_LEFT)) {
62 if (input.JustPressed(Input::PAD_RIGHT)) {
66 if (input.JustPressed(Input::ACTION_A)) {
67 switch (menu.Selected()) {
69 Ctrl().PushState(new CapsuleFeedMenu(this));
73 Ctrl().PushState(new CapsuleChangeMenu(this));
77 Ctrl().PushState(new CapsuleNameMenu(this));
81 } else if (input.JustPressed(Input::ACTION_B)) {
86 void CapsuleMenu::UpdateWorld(float deltaT) {
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(
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 const Vector<int> statsOffset(
102 12 * font.CharWidth(),
103 15 * font.CharHeight() - font.CharHeight() / 8);
104 const Vector<int> menuOffset(
106 24 * font.CharHeight() - font.CharHeight() / 8);
108 RenderBackground(screen);
109 RenderCapsule(screen, offset + capsuleOffset);
110 RenderInfo(screen, offset + infoOffset);
111 RenderWheel(screen, offset + wheelOffset);
112 RenderStats(screen, offset + statsOffset);
113 RenderMenu(screen, offset + menuOffset);
116 void CapsuleMenu::RenderBackground(SDL_Surface *screen) const {
117 Res().capsulebg->Render(screen, Vector<int>(), Vector<int>(screen->w, screen->h));
120 void CapsuleMenu::RenderCapsule(SDL_Surface *screen, const Vector<int> &offset) const {
121 GetCapsule().BattleSprite()->DrawCenterBottom(screen, offset);
124 void CapsuleMenu::RenderInfo(SDL_Surface *screen, const Vector<int> &offset) const {
125 const Capsule &capsule(GetCapsule());
126 const Font &font(*Res().statusFont);
127 const Vector<int> delimiterOffset(5 * font.CharWidth(), 0);
128 const Vector<int> valueOffset(6 * font.CharWidth(), 0);
129 const Vector<int> lineBreak(0, font.CharHeight() + font.CharHeight() / 2);
130 Vector<int> lineHead(offset);
132 font.DrawString(Res().capsuleNameLabel, screen, lineHead, 5);
133 font.DrawChar(':', screen, lineHead + delimiterOffset);
134 font.DrawString(capsule.Name(), screen, lineHead + valueOffset);
136 lineHead += lineBreak;
137 font.DrawString(Res().capsuleClassLabel, screen, lineHead, 5);
138 font.DrawChar(':', screen, lineHead + delimiterOffset);
139 font.DrawString(capsule.ClassName(), screen, lineHead + valueOffset);
141 lineHead += lineBreak;
142 font.DrawString(Res().capsuleAlignmentLabel, screen, lineHead, 5);
143 font.DrawChar(':', screen, lineHead + delimiterOffset);
144 font.DrawString(capsule.Alignment(), screen, lineHead + valueOffset);
146 lineHead += lineBreak;
147 font.DrawString(Res().capsuleTribeLabel, screen, lineHead, 5);
148 font.DrawChar(':', screen, lineHead + delimiterOffset);
149 font.DrawString(capsule.Tribe(), screen, lineHead + valueOffset);
151 lineHead += lineBreak;
152 font.DrawString(Res().capsuleAttack1Label, screen, lineHead, 5);
153 font.DrawChar(':', screen, lineHead + delimiterOffset);
154 if (capsule.Attack1()) {
155 font.DrawString(capsule.Attack1()->Name(), screen, lineHead + valueOffset);
157 font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset);
160 lineHead += lineBreak;
161 font.DrawString(Res().capsuleAttack1Label, screen, lineHead, 5);
162 font.DrawChar(':', screen, lineHead + delimiterOffset);
163 if (capsule.Attack2()) {
164 font.DrawString(capsule.Attack2()->Name(), screen, lineHead + valueOffset);
166 font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset);
169 lineHead += lineBreak;
170 font.DrawString(Res().capsuleAttack1Label, screen, lineHead, 5);
171 font.DrawChar(':', screen, lineHead + delimiterOffset);
172 if (capsule.Attack3()) {
173 font.DrawString(capsule.Attack3()->Name(), screen, lineHead + valueOffset);
175 font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset);
179 void CapsuleMenu::RenderWheel(SDL_Surface *screen, const Vector<int> &offset) const {
183 void CapsuleMenu::RenderStats(SDL_Surface *screen, const Vector<int> &offset) const {
184 const Capsule &capsule(GetCapsule());
185 Stats stats(capsule.GetStats());
186 const Font &font(*Res().statusFont);
187 const Vector<int> lineBreak(0, font.CharHeight());
188 Vector<int> lineHead(offset);
190 RenderStatsLine(screen, lineHead, Res().hpLabel, capsule.MaxHealth());
191 lineHead += lineBreak;
192 RenderStatsLine(screen, lineHead, Res().atpLabel, stats.Attack());
193 lineHead += lineBreak;
194 RenderStatsLine(screen, lineHead, Res().dfpLabel, stats.Defense());
195 lineHead += lineBreak;
196 RenderStatsLine(screen, lineHead, Res().strLabel, stats.Strength());
197 lineHead += lineBreak;
198 RenderStatsLine(screen, lineHead, Res().aglLabel, stats.Agility());
199 lineHead += lineBreak;
200 RenderStatsLine(screen, lineHead, Res().intLabel, stats.Intelligence());
201 lineHead += lineBreak;
202 RenderStatsLine(screen, lineHead, Res().gutLabel, stats.Gut());
203 lineHead += lineBreak;
204 RenderStatsLine(screen, lineHead, Res().mgrLabel, stats.MagicResistance());
206 lineHead = offset + Vector<int>(18 * font.CharWidth(), 0);
207 font.DrawStringRight(Res().levelLabel, screen, lineHead);
208 lineHead += lineBreak;
209 font.DrawNumberRight(capsule.Level(), screen, lineHead);
210 lineHead += 2 * lineBreak;
211 font.DrawStringRight(Res().experienceLabel, screen, lineHead);
212 lineHead += lineBreak;
213 font.DrawNumberRight(capsule.Experience(), screen, lineHead);
214 lineHead += 2 * lineBreak;
215 font.DrawStringRight(Res().nextLevelLabel, screen, lineHead);
216 lineHead += lineBreak;
217 font.DrawNumberRight(capsule.NextLevel(), screen, lineHead);
220 void CapsuleMenu::RenderStatsLine(SDL_Surface *screen, const geometry::Vector<int> &offset, const char *name, int value) const {
221 const Font &font(*Res().statusFont);
222 const Vector<int> numberOffset(4 * font.CharWidth(), 0);
224 font.DrawString(name, screen, offset, 4);
225 font.DrawNumber(value, screen, offset + numberOffset, 3);
228 void CapsuleMenu::RenderMenu(SDL_Surface *screen, const Vector<int> &offset) const {
229 const Font &font(*Res().normalFont);
230 const Frame &frame(*Res().statusFrame);
231 const Vector<int> menuOffset(3 * font.CharWidth(), font.CharHeight());
233 frame.Draw(screen, offset, 30 * font.CharWidth(), 3 * font.CharHeight());
234 menu.Draw(screen, offset + menuOffset);
238 common::GameConfig &CapsuleMenu::Game() {
239 return parent->Game();
242 const common::GameConfig &CapsuleMenu::Game() const {
243 return parent->Game();
246 Resources &CapsuleMenu::Res() {
247 return parent->Res();
250 const Resources &CapsuleMenu::Res() const {
251 return parent->Res();
255 int CapsuleMenu::Width() const {
256 return parent->Width();
259 int CapsuleMenu::Height() const {
260 return parent->Height();
263 const Capsule &CapsuleMenu::GetCapsule() const {
264 return *Game().state->capsule;