1 #include "CapsuleMenu.h"
3 #include "CapsuleChangeMenu.h"
4 #include "CapsuleFeedMenu.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"
18 using common::Capsule;
20 using geometry::Vector;
22 using graphics::Frame;
26 CapsuleMenu::CapsuleMenu(PartyMenu *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);
35 void CapsuleMenu::OnEnterState(SDL_Surface *) {
39 void CapsuleMenu::OnExitState(SDL_Surface *) {
43 void CapsuleMenu::OnResumeState(SDL_Surface *) {
47 void CapsuleMenu::OnPauseState(SDL_Surface *) {
52 void CapsuleMenu::OnResize(int width, int height) {
57 void CapsuleMenu::HandleEvents(const Input &input) {
58 if (input.JustPressed(Input::PAD_LEFT)) {
61 if (input.JustPressed(Input::PAD_RIGHT)) {
65 if (input.JustPressed(Input::ACTION_A)) {
66 switch (menu.Selected()) {
68 Ctrl().PushState(new CapsuleFeedMenu(this));
72 Ctrl().PushState(new CapsuleChangeMenu(this));
80 } else if (input.JustPressed(Input::ACTION_B)) {
85 void CapsuleMenu::UpdateWorld(float deltaT) {
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(
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(
105 24 * font.CharHeight() - font.CharHeight() / 8);
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);
115 void CapsuleMenu::RenderBackground(SDL_Surface *screen) const {
116 Res().capsulebg->Render(screen, Vector<int>(), Vector<int>(screen->w, screen->h));
119 void CapsuleMenu::RenderCapsule(SDL_Surface *screen, const Vector<int> &offset) const {
120 GetCapsule().BattleSprite()->DrawCenterBottom(screen, offset);
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);
131 font.DrawString(Res().capsuleNameLabel, screen, lineHead, 5);
132 font.DrawChar(':', screen, lineHead + delimiterOffset);
133 font.DrawString(capsule.Name(), screen, lineHead + valueOffset);
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);
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);
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);
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);
156 font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset);
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);
165 font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset);
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);
174 font.DrawString(Res().capsuleNoAttackText, screen, lineHead + valueOffset);
178 void CapsuleMenu::RenderWheel(SDL_Surface *screen, const Vector<int> &offset) const {
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);
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());
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);
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);
223 font.DrawString(name, screen, offset, 4);
224 font.DrawNumber(value, screen, offset + numberOffset, 3);
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());
232 frame.Draw(screen, offset, 30 * font.CharWidth(), 3 * font.CharHeight());
233 menu.Draw(screen, offset + menuOffset);
237 common::GameConfig &CapsuleMenu::Game() {
238 return parent->Game();
241 const common::GameConfig &CapsuleMenu::Game() const {
242 return parent->Game();
245 Resources &CapsuleMenu::Res() {
246 return parent->Res();
249 const Resources &CapsuleMenu::Res() const {
250 return parent->Res();
254 int CapsuleMenu::Width() const {
255 return parent->Width();
258 int CapsuleMenu::Height() const {
259 return parent->Height();
262 const Capsule &CapsuleMenu::GetCapsule() const {
263 return *Game().state->capsule;