16 constexpr
float FlashTime = 0.35f;
17 constexpr
float PageLabelX = 612.f;
18 constexpr
float ArrowPadding = 10.f;
19 constexpr
float ThumbSize = 270.f;
20 const glm::vec2 BasicPos(342.f, 78.f);
21 const glm::vec2 MovePos(329.f, 260.f);
30 :
State(s,
bl::engine::StateMask::Menu)
34 s.
engine(), s.
engine().renderer().getObserver(), bl::menu::NoSelector::create());
37 const std::string ImgPath =
39 const auto loadImg = [&ImgPath, &s](
const std::string& path) -> bl::rc::res::TextureRef {
40 return s.
engine().renderer().texturePool().getOrLoadTexture(
41 bl::util::FileUtil::joinPath(ImgPath, path));
44 bgndTxtr = loadImg(
"background.png");
45 background.create(s.
engine(), bgndTxtr);
47 leftTxtr = loadImg(
"leftArrow.png");
48 leftArrow.create(s.
engine(), leftTxtr);
49 leftArrow.setParent(background);
50 leftArrow.getTransform().setOrigin(leftTxtr->size().x, leftTxtr->size().y * 0.5f);
51 leftArrow.getTransform().setPosition(0.f, 32.f);
53 rightTxtr = loadImg(
"rightArrow.png");
54 rightArrow.create(s.
engine(), rightTxtr);
55 rightArrow.getTransform().setOrigin(0.f, rightTxtr->size().y * 0.5f);
56 rightArrow.getTransform().setPosition(0.f, 31.f);
57 rightArrow.setParent(background);
59 pageLabel.create(s.
engine(), font,
"", 30, sf::Color::Black);
60 pageLabel.setParent(background);
61 pageLabel.getTransform().setPosition(PageLabelX, 31.f);
63 thumbTxtr = s.
engine().renderer().texturePool().getOrLoadTexture(
65 thumbnail.create(s.
engine(), thumbTxtr);
66 thumbnail.getTransform().setPosition(30.f, 165.f);
67 thumbnail.getTransform().setScale(ThumbSize / thumbTxtr->size());
68 thumbnail.setParent(background);
70 nameLabel.create(s.
engine(), font, ppl.
name(), 28, sf::Color(200, 40, 10));
71 nameLabel.getTransform().setPosition(13.f, 75.f);
72 nameLabel.setParent(background);
75 s.
engine(), font, std::to_string(
static_cast<int>(ppl.
id())), 18, sf::Color(200, 200, 255));
76 idLabel.getTransform().setPosition(57.f, 122.f);
77 idLabel.setParent(background);
81 levelLabel.getTransform().setPosition(254.f, 115.f);
82 levelLabel.setParent(background);
84 itemLabel.create(s.
engine(),
90 sf::Color(200, 255, 230));
91 itemLabel.getTransform().setPosition(79.f, 473.f);
92 itemLabel.setParent(background);
95 s.
engine(), font, std::to_string(ppl.
currentXP()), 16, sf::Color(50, 200, 255));
96 curXpLabel.getTransform().setPosition(101.f, 495.f);
97 curXpLabel.setParent(background);
100 s.
engine(), font, std::to_string(ppl.
nextLevelXP()), 16, sf::Color(20, 140, 220));
101 nextXpLabel.getTransform().setPosition(101.f, 518.f);
102 nextXpLabel.setParent(background);
104 ailLabel.create(s.
engine(),
109 sf::Color(230, 50, 50));
110 ailLabel.getTransform().setPosition(155.f, 563.f);
111 ailLabel.setParent(background);
113 basicsTxtr = loadImg(
"basicsBox.png");
114 basicsBox.create(s.
engine(), basicsTxtr);
115 basicsBox.getTransform().setPosition(BasicPos);
116 basicsBox.setParent(background);
120 speciesLabel.getTransform().setPosition(26.f, 83.f);
121 speciesLabel.getTransform().setOrigin(0.f, speciesLabel.getLocalBounds().height * 0.5f);
122 speciesLabel.setParent(basicsBox);
124 typeLabel.create(s.
engine(),
128 sf::Color(30, 170, 85));
129 typeLabel.getTransform().setOrigin(0.f, typeLabel.getLocalBounds().height * 0.5f);
130 typeLabel.getTransform().setPosition(speciesLabel.getLocalBounds().width + 36.f, 85.f);
133 const sf::Color statColor(30, 165, 80);
135 hpLabel.create(s.
engine(),
137 std::to_string(ppl.
currentHp()) +
" / " + std::to_string(stats.
hp),
140 hpLabel.getTransform().setPosition(90.f, 135.f);
141 hpLabel.setParent(basicsBox);
143 atkLabel.create(s.
engine(), font, std::to_string(stats.
atk), 18, statColor);
144 atkLabel.getTransform().setPosition(102.f, 189.f);
145 atkLabel.setParent(basicsBox);
147 defLabel.create(s.
engine(), font, std::to_string(stats.
def), 18, statColor);
148 defLabel.getTransform().setPosition(102.f, 243.f);
149 defLabel.setParent(basicsBox);
151 spAtkLabel.create(s.
engine(), font, std::to_string(stats.
spatk), 18, statColor);
152 spAtkLabel.getTransform().setPosition(296.f, 191.f);
153 spAtkLabel.setParent(basicsBox);
155 spDefLabel.create(s.
engine(), font, std::to_string(stats.
spdef), 18, statColor);
156 spDefLabel.getTransform().setPosition(298.f, 245.f);
157 spDefLabel.setParent(basicsBox);
159 spdLabel.create(s.
engine(), font, std::to_string(stats.
spd), 18, statColor);
160 spdLabel.getTransform().setPosition(298.f, 296.f);
161 spdLabel.setParent(basicsBox);
163 descLabel.create(s.
engine(),
167 sf::Color(230, 230, 230));
168 descLabel.getTransform().setPosition(30.f, 350.f);
169 descLabel.wordWrap(397.f);
170 descLabel.setParent(basicsBox);
172 abilityLabel.create(s.
engine(),
176 sf::Color(40, 200, 100));
177 abilityLabel.getTransform().setPosition(30.f, 437.f);
178 abilityLabel.setParent(basicsBox);
180 abilityDescLabel.create(s.
engine(),
184 sf::Color(220, 220, 220));
185 abilityDescLabel.getTransform().setPosition(45.f,
186 abilityLabel.getTransform().getLocalPosition().y +
187 abilityLabel.getLocalBounds().height + 4.f);
188 abilityDescLabel.setParent(basicsBox);
190 moveTxtr = loadImg(
"moveBox.png");
191 moveBox.create(s.
engine(), moveTxtr);
192 moveBox.getTransform().setPosition(MovePos);
193 moveBox.setParent(background);
195 movePwrLabel.create(s.
engine(), font,
"999", 22, sf::Color(152, 81, 81));
196 movePwrLabel.getTransform().setPosition(228.f, 54.f);
197 movePwrLabel.setParent(moveBox);
199 moveAccLabel.create(s.
engine(), font,
"999", 22, sf::Color(58, 161, 151));
200 moveAccLabel.getTransform().setPosition(228.f, 93.f);
201 moveAccLabel.setParent(moveBox);
203 moveTypeLabel.create(s.
engine(), font,
"999", 22, sf::Color(76, 162, 50));
204 moveTypeLabel.getTransform().setPosition(228.f, 137.f);
205 moveTypeLabel.setParent(moveBox);
207 moveDescLabel.create(s.
engine(), font,
"", 16, sf::Color(220, 220, 220));
208 moveDescLabel.getTransform().setPosition(46.f, 196.f);
209 moveDescLabel.wordWrap(376.f);
210 moveDescLabel.setParent(moveBox);
212 std::vector<menu::MoveInfoRow::Ptr> items;
214 for (
int i = 0; i < 4; ++i) {
219 ->getSignal(bl::menu::Item::Selected)
220 .willAlwaysCall(std::bind(&PeoplemonInfo::highlightMove,
this, move));
223 if (!items.empty()) {
224 moveMenu.setPadding({0.f, 4.f});
225 moveMenu.setRootItem(items.front());
226 bl::menu::Item* prev = items.front().get();
227 for (
unsigned int i = 1; i < items.size(); ++i) {
228 moveMenu.addItem(items[i], prev, bl::menu::Item::Bottom);
229 prev = items[i].get();
231 moveMenu.setSelectedItem(items.front().get());
233 else { BL_LOG_CRITICAL <<
"Peoplemon has no moves!"; }
234 moveMenu.setPosition({565.f - moveMenu.getBounds().width * 0.5f, 60.f});
240 systems.
engine().inputSystem().getActor().addListener(*
this);
242 auto overlay = engine.renderer().getObserver().pushScene<bl::rc::Overlay>();
243 background.addToScene(overlay, bl::rc::UpdateSpeed::Static);
244 leftArrow.addToScene(overlay, bl::rc::UpdateSpeed::Static);
245 rightArrow.addToScene(overlay, bl::rc::UpdateSpeed::Static);
246 pageLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
247 thumbnail.addToScene(overlay, bl::rc::UpdateSpeed::Static);
248 nameLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
249 idLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
250 levelLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
251 itemLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
252 curXpLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
253 nextXpLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
254 ailLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
255 basicsBox.addToScene(overlay, bl::rc::UpdateSpeed::Static);
256 speciesLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
257 typeLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
258 hpLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
259 atkLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
260 defLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
261 spdLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
262 spAtkLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
263 spDefLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
264 descLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
265 abilityLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
266 abilityDescLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
267 moveBox.addToScene(overlay, bl::rc::UpdateSpeed::Static);
268 movePwrLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
269 moveAccLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
270 moveTypeLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
271 moveDescLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
272 moveMenu.addToOverlay(background.entity());
274 setPage(ActivePage::Basics);
280 systems.
engine().inputSystem().getActor().removeListener(*
this);
281 engine.renderer().getObserver().popScene();
287 if (flashDelay >= 0.f) {
289 if (flashDelay >= FlashTime) {
296 bool PeoplemonInfo::observe(
const bl::input::Actor&,
unsigned int cmd, bl::input::DispatchType,
297 bool eventTriggered) {
298 if (inputDebounce < 0.4f && !eventTriggered)
return true;
303 if (activePage == ActivePage::Moves) { setPage(ActivePage::Basics); }
306 if (activePage == ActivePage::Basics) { setPage(ActivePage::Moves); }
309 if (activePage == ActivePage::Moves) {
310 moveMenu.processEvent(
311 bl::menu::Event(bl::menu::Event::MoveEvent(bl::menu::Item::AttachPoint::Bottom)));
315 if (activePage == ActivePage::Moves) {
316 moveMenu.processEvent(
317 bl::menu::Event(bl::menu::Event::MoveEvent(bl::menu::Item::AttachPoint::Top)));
332 const int acc = Move::accuracy(move);
334 movePwrLabel.getSection().setString(std::to_string(Move::damage(move)));
335 moveAccLabel.getSection().setString(acc > 0 ? std::to_string(acc) :
"Always hits");
337 moveDescLabel.getSection().setString(Move::description(move));
340 void PeoplemonInfo::setPage(ActivePage page) {
345 case ActivePage::Basics:
346 pageLabel.getSection().setString(
"Basic Information");
347 pageLabel.getSection().setFillColor(sf::Color(30, 100, 255));
348 basicsBox.setHidden(
false);
349 moveBox.setHidden(
true);
350 moveMenu.setHidden(
true);
352 offset = -(rightTxtr->size().x * 0.5f);
353 if (flashDelay < 0.f) {
354 rightArrow.flash(FlashTime, FlashTime);
355 leftArrow.stopFlashing();
357 rightArrow.setHidden(
false);
358 leftArrow.setHidden(
true);
360 case ActivePage::Moves:
361 pageLabel.getSection().setString(
"Known Moves");
362 pageLabel.getSection().setFillColor(sf::Color(255, 50, 50));
363 basicsBox.setHidden(
true);
364 moveBox.setHidden(
false);
365 moveMenu.setHidden(
false);
367 if (flashDelay < 0.f) {
368 leftArrow.flash(FlashTime, FlashTime);
369 rightArrow.stopFlashing();
371 leftArrow.setHidden(
false);
372 rightArrow.setHidden(
true);
376 pageLabel.getTransform().setPosition(PageLabelX + offset,
377 pageLabel.getTransform().getLocalPosition().y);
378 pageLabel.getTransform().setOrigin(pageLabel.getGlobalSize() * 0.5f);
379 leftArrow.getTransform().setPosition(pageLabel.getTransform().getLocalPosition().x -
380 pageLabel.getTransform().getOrigin().x - ArrowPadding,
381 leftArrow.getTransform().getLocalPosition().y);
382 rightArrow.getTransform().setPosition(pageLabel.getTransform().getLocalPosition().x +
383 pageLabel.getTransform().getOrigin().x + ArrowPadding,
384 rightArrow.getTransform().getLocalPosition().y);
Parent namespace for all functionality unique to the game.
static const std::string & getName(item::Id item)
Returns the name of the given item.
Encapsulates the move datastore.
MoveId id
The id of the move.
Represents an instance of a peoplemon. Can be a wild peoplemon, trainer, or player peoplemon....
Type type() const
Returns the type of the peoplemon.
Ailment & currentAilment()
Access the current ailment of this peoplemon.
SpecialAbility ability() const
Returns the special ability of this peoplemon.
unsigned int nextLevelXP() const
Returns the xp required to level up.
std::uint16_t & currentHp()
Access the current HP.
unsigned int currentLevel() const
Returns the current level of this peoplemon.
Stats currentStats() const
Returns the computed stats for the peoplemon. Does not take into account changes during battle.
Id id() const
Returns the id of this peoplemon.
unsigned int currentXP() const
Returns the current XP of this peoplemon.
const OwnedMove * knownMoves() const
Returns the moves known by this Peoplemon.
item::Id & holdItem()
Access the current hold item of this peoplemon.
const std::string & name() const
Returns the name of this peoplemon, custom or defualt.
static const std::string & abilityDescription(SpecialAbility ability)
Returns the description of the given special ability.
static const std::string & description(Id id)
Returns the description of the given Peoplemon.
static std::string ailmentString(Ailment ailment)
Returns the name of the given ailment as a string.
static const std::string & name(Id id)
Returns the name of the given Peoplemon.
static const std::string & abilityName(SpecialAbility ability)
Returns the name of the given special ability.
static std::string thumbnailImage(Id id)
Returns the path of the image to render as the peoplemon thumbnail.
Stats for Peoplemon. This struct is used for base stats, EVs, IVs, battle increases/decreases,...
static std::string getTypeString(Type type)
Returns the type as a user-facing text string.
static const sf::VulkanFont & MenuFont()
static const std::string & MenuImagePath()
Owns all primary systems and a reference to the engine.
const bl::engine::Engine & engine() const
Const accessor for the Engine.
static bl::menu::Item::Ptr create(core::pplmn::MoveId move)
Create a new move row.
Menu for displaying information about a specific peoplemon the player owns.
virtual void activate(bl::engine::Engine &engine) override
Activates the state.
virtual const char * name() const override
Returns "Peopledex".
virtual void update(bl::engine::Engine &engine, float dt, float) override
Updates the state and menus and whatnot.
static bl::engine::State::Ptr create(core::system::Systems &systems, const core::pplmn::OwnedPeoplemon &ppl)
Create a new PeoplemonInfo engine state.
virtual void deactivate(bl::engine::Engine &engine) override
Deactivates the state.
Parent to all game states. Provides some commonly required data like core game systems.
core::system::Systems & systems