1 #include "CapsuleMenu.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"
16 using common::Capsule;
18 using geometry::Vector;
20 using graphics::Frame;
24 CapsuleMenu::CapsuleMenu(PartyMenu *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);
33 void CapsuleMenu::OnEnterState(SDL_Surface *) {
37 void CapsuleMenu::OnExitState(SDL_Surface *) {
41 void CapsuleMenu::OnResumeState(SDL_Surface *) {
45 void CapsuleMenu::OnPauseState(SDL_Surface *) {
50 void CapsuleMenu::OnResize(int width, int height) {
55 void CapsuleMenu::HandleEvents(const Input &input) {
56 if (input.JustPressed(Input::PAD_LEFT)) {
59 if (input.JustPressed(Input::PAD_RIGHT)) {
63 if (input.JustPressed(Input::ACTION_B)) {
68 void CapsuleMenu::UpdateWorld(float deltaT) {
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(
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(
88 24 * font.CharHeight() - font.CharHeight() / 8);
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);
98 void CapsuleMenu::RenderBackground(SDL_Surface *screen) const {
99 parent->Res().capsulebg->Render(screen, Vector<int>(), Vector<int>(screen->w, screen->h));
102 void CapsuleMenu::RenderCapsule(SDL_Surface *screen, const Vector<int> &offset) const {
103 GetCapsule().BattleSprite()->DrawCenterBottom(screen, offset);
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);
114 font.DrawString(parent->Res().capsuleNameLabel, screen, lineHead, 5);
115 font.DrawChar(':', screen, lineHead + delimiterOffset);
116 font.DrawString(capsule.Name(), screen, lineHead + valueOffset);
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);
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);
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);
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);
139 font.DrawString(parent->Res().capsuleNoAttackText, screen, lineHead + valueOffset);
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);
148 font.DrawString(parent->Res().capsuleNoAttackText, screen, lineHead + valueOffset);
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);
157 font.DrawString(parent->Res().capsuleNoAttackText, screen, lineHead + valueOffset);
161 void CapsuleMenu::RenderWheel(SDL_Surface *screen, const Vector<int> &offset) const {
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);
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());
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);
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);
206 font.DrawString(name, screen, offset, 4);
207 font.DrawNumber(value, screen, offset + numberOffset, 3);
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());
215 frame.Draw(screen, offset, 30 * font.CharWidth(), 3 * font.CharHeight());
216 menu.Draw(screen, offset + menuOffset);
219 int CapsuleMenu::Width() const {
220 return parent->Width();
223 int CapsuleMenu::Height() const {
224 return parent->Height();
227 const Capsule &CapsuleMenu::GetCapsule() const {
228 return *parent->Game().state->capsule;