Peoplemon  0.1.0
Peoplemon 3 game source documentation
PeoplemonMenu.cpp
Go to the documentation of this file.
2 
3 #include <Core/Items/Item.hpp>
5 #include <Core/Properties.hpp>
6 #include <Core/Resources.hpp>
8 
9 namespace game
10 {
11 namespace state
12 {
13 namespace
14 {
15 constexpr float MoveTime = 0.55f;
16 
17 std::string getPickText(core::event::OpenPeoplemonMenu::Context ctx) {
19 
20  switch (ctx) {
21  case Ctx::GiveItem:
22  return "Give";
23  case Ctx::StorageSelect:
24  return "Store";
25  case Ctx::UseItem:
26  case Ctx::UseItemBattle:
27  return "Use";
28  case Ctx::BattleFaint:
29  case Ctx::BattleMustSwitch:
30  case Ctx::BattleReviveSwitch:
31  case Ctx::BattleSwitch:
32  return "Switch";
33  default:
34  return "ERROR";
35  }
36 }
37 } // namespace
38 
39 bl::engine::State::Ptr PeoplemonMenu::create(core::system::Systems& s, Context c, int outNow,
40  int* chosen, core::item::Id item) {
41  return Ptr(new PeoplemonMenu(s, c, outNow, chosen, item));
42 }
43 
44 PeoplemonMenu::PeoplemonMenu(core::system::Systems& s, Context c, int on, int* sp,
45  core::item::Id item)
46 : State(s, bl::engine::StateMask::Menu)
47 , context(c)
48 , outNow(on)
49 , chosenPeoplemon(sp)
50 , useItem(item)
51 , state(Browsing)
52 , actionOpen(false) {
53  menu.create(s.engine(), s.engine().renderer().getObserver(), bl::menu::NoSelector::create());
54  actionMenu.create(s.engine(),
55  s.engine().renderer().getObserver(),
56  bl::menu::ArrowSelector::create(10.f, sf::Color::Black));
57 
58  backgroundTxtr =
59  s.engine().renderer().texturePool().getOrLoadTexture(bl::util::FileUtil::joinPath(
60  core::Properties::MenuImagePath(), "Peoplemon/background.png"));
61  background.create(s.engine(), backgroundTxtr);
62 
63  const glm::vec2 MenuPosition(41.f, 5.f);
66  menu.setRootItem(ppl);
67  menu.setPosition(MenuPosition);
68  menu.configureBackground(
69  sf::Color::Transparent, sf::Color::Transparent, 0.f, {0.f, 0.f, 0.f, 0.f});
70 
71  backBut = bl::menu::ImageItem::create(s.engine().renderer().texturePool().getOrLoadTexture(
72  bl::util::FileUtil::joinPath(core::Properties::MenuImagePath(), "Peoplemon/cancel.png")));
73  backBut->overridePosition(
75  backBut->getSize() - MenuPosition - glm::vec2(10.f, 5.f));
76  backBut->getSignal(bl::menu::Item::Selected).willAlwaysCall([this]() {
77  backBut->getSprite().setColor(sf::Color(180, 100, 80));
78  });
79  backBut->getSignal(bl::menu::Item::Deselected).willAlwaysCall([this]() {
80  backBut->getSprite().setColor(sf::Color::White);
81  });
82  backBut->getSignal(bl::menu::Item::Activated).willAlwaysCall([this]() {
83  systems.engine().popState();
84  });
85 
86  if (context == Context::PauseMenu) {
87  bl::menu::TextItem::Ptr info = bl::menu::TextItem::create(
88  "Summary", core::Properties::MenuFont(), sf::Color::Black, 26);
89  bl::menu::TextItem::Ptr move =
90  bl::menu::TextItem::create("Move", core::Properties::MenuFont(), sf::Color::Black, 26);
91  bl::menu::TextItem::Ptr item = bl::menu::TextItem::create(
92  "Take Item", core::Properties::MenuFont(), sf::Color::Black, 26);
93  bl::menu::TextItem::Ptr back =
94  bl::menu::TextItem::create("Back", core::Properties::MenuFont(), sf::Color::Black, 26);
95 
96  info->getSignal(bl::menu::Item::Activated)
97  .willAlwaysCall(std::bind(&PeoplemonMenu::showInfo, this));
98  move->getSignal(bl::menu::Item::Activated)
99  .willAlwaysCall(std::bind(&PeoplemonMenu::startMove, this));
100  item->getSignal(bl::menu::Item::Activated)
101  .willAlwaysCall(std::bind(&PeoplemonMenu::takeItem, this));
102  back->getSignal(bl::menu::Item::Activated)
103  .willAlwaysCall(std::bind(&PeoplemonMenu::resetAction, this));
104 
105  actionMenu.setRootItem(info);
106  actionMenu.addItem(item, info.get(), bl::menu::Item::Bottom);
107  actionMenu.addItem(back, item.get(), bl::menu::Item::Right);
108  actionMenu.addItem(move, back.get(), bl::menu::Item::Top);
109  actionMenu.attachExisting(move.get(), info.get(), bl::menu::Item::Right);
110  actionRoot = info.get();
111  }
112  else {
113  bl::menu::TextItem::Ptr sel = bl::menu::TextItem::create(
114  getPickText(context), core::Properties::MenuFont(), sf::Color::Black, 26);
115  bl::menu::TextItem::Ptr back =
116  bl::menu::TextItem::create("Back", core::Properties::MenuFont(), sf::Color::Black, 26);
117 
118  sel->getSignal(bl::menu::Item::Activated)
119  .willAlwaysCall(std::bind(&PeoplemonMenu::chosen, this));
120  back->getSignal(bl::menu::Item::Activated)
121  .willAlwaysCall(std::bind(&PeoplemonMenu::resetAction, this));
122 
123  actionMenu.setRootItem(sel);
124  actionMenu.addItem(back, sel.get(), bl::menu::Item::Right);
125  actionRoot = back.get();
126  }
127  actionMenu.setMinHeight(36.f);
128  actionMenu.setPadding({24.f, 12.f});
129  actionMenu.configureBackground(sf::Color::White, sf::Color::Black, 3.f, {18.f, 4.f, 4.f, 4.f});
130  actionMenu.setDepth(bl::cam::OverlayCamera::MinDepth + 1.f);
131 }
132 
133 const char* PeoplemonMenu::name() const { return "PeoplemonMenu"; }
134 
135 void PeoplemonMenu::activate(bl::engine::Engine& engine) {
136  for (unsigned int i = 0; i < 6; ++i) { buttons[i].reset(); }
137 
138  const auto& team = systems.player().state().peoplemon;
139  const unsigned int col1N = team.size() / 2 + team.size() % 2;
140  const unsigned int col2N = team.size() / 2;
141  for (unsigned int i = 0; i < col1N; ++i) {
142  buttons[i * 2] = menu::PeoplemonButton::create(team[i * 2]);
143  }
144  for (unsigned int i = 0; i < col2N; ++i) {
145  buttons[i * 2 + 1] = menu::PeoplemonButton::create(team[i * 2 + 1]);
146  }
147  for (unsigned int i = 0; i < team.size(); ++i) {
148  if (team[i].currentHp() == 0) { buttons[i]->setHighlightColor(sf::Color(200, 10, 10)); }
149  else if (outNow >= 0 && static_cast<unsigned int>(outNow) == i) {
150  // outNow should only be positive in battle so no need to check context
151  buttons[i]->setHighlightColor(sf::Color(90, 110, 250));
152  buttons[i]->setSelectable(false);
153  }
154 
155  setSelectable(i);
156  buttons[i]
157  ->getSignal(bl::menu::Item::Activated)
158  .willAlwaysCall(std::bind(&PeoplemonMenu::selected, this, buttons[i].get()));
159  }
160  menu.setRootItem(buttons[0]);
161  for (unsigned int i = 1; i < col1N; ++i) {
162  menu.addItem(buttons[i * 2], buttons[(i - 1) * 2].get(), bl::menu::Item::Bottom);
163  }
164  for (unsigned int i = 0; i < col2N; ++i) {
165  menu.addItem(buttons[i * 2 + 1], buttons[i * 2].get(), bl::menu::Item::Right);
166  if (i > 0) {
167  menu.attachExisting(
168  buttons[i * 2 + 1].get(), buttons[(i - 1) * 2 + 1].get(), bl::menu::Item::Bottom);
169  }
170  }
171  if (canCancel()) {
172  if (col2N > 0) {
173  menu.addItem(backBut, buttons[(col2N - 1) * 2 + 1].get(), bl::menu::Item::Bottom);
174  menu.attachExisting(
175  backBut.get(), buttons[(col1N - 1) * 2].get(), bl::menu::Item::Bottom, false);
176  }
177  else { menu.addItem(backBut, buttons[(col1N - 1) * 2].get(), bl::menu::Item::Bottom); }
178  }
179 
180  if (canCancel()) { menu.setSelectedItem(backBut.get()); }
181  else { menu.setSelectedItem(buttons[0].get()); }
182  for (unsigned int i = 0; i < team.size(); ++i) {
183  if (buttons[i]->isSelectable()) {
184  menu.setSelectedItem(buttons[i].get());
185  break;
186  }
187  }
188  if (!menu.getSelectedItem()->isSelectable()) {
189  BL_LOG_CRITICAL << "In menu that cannot be canceled with no selectable Peoplemon!";
190  }
191 
192  state = MenuState::Browsing;
193  actionOpen = false;
194  inputDriver.drive(&menu);
195  systems.engine().inputSystem().getActor().addListener(*this);
196  if (chosenPeoplemon) *chosenPeoplemon = -1;
197 
198  auto overlay = engine.renderer().getObserver().pushScene<bl::rc::Overlay>();
199  background.addToScene(overlay, bl::rc::UpdateSpeed::Static);
200  menu.addToOverlay(background.entity());
201  actionMenu.addToOverlay(background.entity());
202  actionMenu.setHidden(true);
203 }
204 
205 void PeoplemonMenu::deactivate(bl::engine::Engine& engine) {
206  inputDriver.drive(nullptr);
207  systems.engine().inputSystem().getActor().removeListener(*this);
208  engine.renderer().getObserver().popScene();
209 }
210 
211 bool PeoplemonMenu::canCancel() const {
212  switch (context) {
216  return false;
217  default:
218  return true;
219  }
220 }
221 
222 void PeoplemonMenu::setSelectable(unsigned int i) {
223  const auto& team = systems.player().state().peoplemon;
224  switch (context) {
227  buttons[i]->setSelectable(team[i].currentHp() > 0);
228  break;
230  buttons[i]->setSelectable(team[i].currentHp() > 0 && static_cast<int>(i) != outNow);
231  break;
233  buttons[i]->setSelectable(team[i].currentHp() == 0 && static_cast<int>(i) != outNow);
234  break;
235  case Context::GiveItem:
236  buttons[i]->setSelectable(team[i].holdItem() == core::item::Id::None);
237  break;
238  case Context::UseItem:
241  if (core::pplmn::Peoplemon::canLearnMove(team[i].id(), mid) &&
242  !team[i].knowsMove(mid)) {
243  buttons[i]->setSelectable(true);
244  buttons[i]->setHighlightColor(sf::Color(78, 191, 191));
245  }
246  else {
247  buttons[i]->setSelectable(false);
248  buttons[i]->setHighlightColor(sf::Color(242, 83, 51));
249  }
250  }
251  else { buttons[i]->setSelectable(true); }
252  break;
253  default:
254  buttons[i]->setSelectable(true);
255  break;
256  }
257 }
258 
259 void PeoplemonMenu::update(bl::engine::Engine&, float dt, float) {
260  const auto updateItems = [this, dt]() {
261  for (int i = 0; i < 6; ++i) {
262  if (buttons[i]) { buttons[i]->update(dt); }
263  }
264  };
265  const auto buttonsSynced = [this]() -> bool {
266  for (int i = 0; i < 6; ++i) {
267  if (buttons[i] && !buttons[i]->synced()) return false;
268  }
269  return true;
270  };
271 
272  switch (state) {
273  case MenuState::Moving: {
274  const glm::vec2 d = moveVel * dt;
275  const float mx = std::abs(std::max(d.x, 5.f));
276  const float my = std::abs(std::max(d.y, 5.f));
277  buttons[mover1]->overridePosition(buttons[mover1]->getPosition() + d);
278  buttons[mover2]->overridePosition(buttons[mover2]->getPosition() - d);
279  if (std::abs(buttons[mover1]->getPosition().x - mover1Dest.x) <= mx &&
280  std::abs(buttons[mover1]->getPosition().y - mover1Dest.y) < my) {
281  cleanupMove(true);
282  }
283  } break;
284 
285  case MenuState::UsingItem:
286  updateItems();
287  if (buttonsSynced()) { state = MenuState::UsingItemWaitMessage; }
288  break;
289 
290  case MenuState::UsingItemWaitView:
291  updateItems();
292  if (buttonsSynced()) { systems.engine().popState(); }
293  break;
294 
295  case MenuState::WaitingForgetConfirm:
296  case MenuState::WaitingForgetChoice:
297  case MenuState::UsingItemWaitMessage:
298  case MenuState::ShowingMessage:
299  default:
300  break;
301  }
302 }
303 
304 bool PeoplemonMenu::observe(const bl::input::Actor&, unsigned int ctrl, bl::input::DispatchType,
305  bool fromEvent) {
306  if (ctrl == core::input::Control::Back && fromEvent) {
307  bl::audio::AudioSystem::playOrRestartSound(core::Properties::MenuBackSound());
308  if (state == MenuState::SelectingMove) { cleanupMove(false); }
309  else if (state == MenuState::Browsing) {
310  if (actionOpen) { resetAction(); }
311  else if (context != Context::BattleFaint) { systems.engine().popState(); }
312  }
313  }
314  else { inputDriver.sendControl(ctrl, fromEvent); }
315  return true;
316 }
317 
318 void PeoplemonMenu::selected(menu::PeoplemonButton* b) {
319  unsigned int i = 0;
320  for (; i < 6; ++i) {
321  if (buttons[i].get() == b) break;
322  }
323  if (buttons[i].get() != b) {
324  BL_LOG_ERROR << "Invalid button pointer";
325  return;
326  }
327 
328  switch (state) {
329  case Browsing:
330  actionOpen = true;
331  actionMenu.setPosition(
332  buttons[i]->getPosition() + buttons[i]->getSize() +
333  glm::vec2(menu.getBounds().left, menu.getBounds().top) -
334  glm::vec2(actionMenu.getBounds().width, actionMenu.getBounds().height));
335  actionMenu.setSelectedItem(actionRoot);
336  actionMenu.setHidden(false);
337  inputDriver.drive(&actionMenu);
338  mover1 = i;
339  break;
340 
341  case SelectingMove:
342  mover2 = i;
343  mover1Dest = buttons[mover2]->getPosition();
344  mover2Dest = buttons[mover1]->getPosition();
345  moveVel = (mover1Dest - mover2Dest) / MoveTime;
346  state = MenuState::Moving;
347  inputDriver.drive(nullptr);
348  closeActionMenu();
349  break;
350 
351  case Moving:
352  default:
353  break;
354  }
355 }
356 
357 void PeoplemonMenu::showInfo() {
358  systems.engine().pushState(
360 }
361 
362 void PeoplemonMenu::startMove() {
363  if (systems.player().state().peoplemon.size() > 1) {
364  state = MenuState::SelectingMove;
365  inputDriver.drive(&menu);
366  buttons[mover1]->setHighlightColor(sf::Color(40, 120, 230));
367 
368  if (mover1 % 2 == 0) {
369  if (buttons[mover1 + 1]) { menu.setSelectedItem(buttons[mover1 + 1].get()); }
370  else { menu.setSelectedItem(buttons[mover1 - 2].get()); }
371  }
372  else { menu.setSelectedItem(buttons[mover1 - 1].get()); }
373  }
374 }
375 
376 void PeoplemonMenu::cleanupMove(bool c) {
377  buttons[mover1]->setHighlightColor(systems.player().state().peoplemon[mover1].currentHp() > 0 ?
378  sf::Color::White :
379  sf::Color(200, 10, 10));
380  state = MenuState::Browsing;
381  closeActionMenu();
382 
383  if (!c) {
384  inputDriver.drive(&actionMenu);
385  menu.setSelectedItem(buttons[mover1].get());
386  }
387  else {
388  buttons[mover1]->overridePosition(mover1Dest);
389  buttons[mover2]->overridePosition(mover2Dest);
390  std::swap(buttons[mover1], buttons[mover2]);
391  std::swap(systems.player().state().peoplemon[mover1],
392  systems.player().state().peoplemon[mover2]);
393  connectButtons();
394  menu.setSelectedItem(buttons[mover2].get());
395  inputDriver.drive(&menu);
396  }
397 }
398 
399 void PeoplemonMenu::takeItem() {
400  auto& ppl = systems.player().state().peoplemon[mover1];
401  const core::item::Id i = ppl.holdItem();
402  if (i != core::item::Id::None) {
403  systems.player().state().bag.addItem(i);
404  ppl.holdItem() = core::item::Id::None;
405  systems.hud().displayMessage(ppl.name() + " had its " + core::item::Item::getName(i) +
406  " taken away",
407  std::bind(&PeoplemonMenu::messageDone, this));
408  }
409  else {
410  systems.hud().displayMessage(ppl.name() + " is not holding anything",
411  std::bind(&PeoplemonMenu::messageDone, this));
412  }
413  state = MenuState::ShowingMessage;
414  inputDriver.drive(nullptr);
415  closeActionMenu();
416 }
417 
418 void PeoplemonMenu::resetAction() {
419  state = MenuState::Browsing;
420  inputDriver.drive(&menu);
421  closeActionMenu();
422 }
423 
424 void PeoplemonMenu::closeActionMenu() {
425  actionOpen = false;
426  actionMenu.setHidden(true);
427 }
428 
429 void PeoplemonMenu::connectButtons() {
430  const unsigned int n = systems.player().state().peoplemon.size();
431  int ml = -1;
432  int mr = -1;
433 
434  for (unsigned int i = 0; i < n; i += 2) {
435  if (buttons[i]) {
436  ml = i;
437  if (i >= 2) {
438  menu.attachExisting(buttons[i].get(), buttons[i - 2].get(), bl::menu::Item::Bottom);
439  }
440  if (buttons[i + 1]) {
441  menu.attachExisting(buttons[i + 1].get(), buttons[i].get(), bl::menu::Item::Right);
442  if (i >= 2) {
443  menu.attachExisting(
444  buttons[i + 1].get(), buttons[i - 1].get(), bl::menu::Item::Bottom);
445  mr = i + 1;
446  }
447  }
448  }
449  }
450 
451  if (canCancel()) {
452  if (mr >= 0) {
453  menu.attachExisting(backBut.get(), buttons[mr].get(), bl::menu::Item::Bottom);
454  menu.attachExisting(backBut.get(), buttons[ml].get(), bl::menu::Item::Bottom, false);
455  }
456  else { menu.attachExisting(backBut.get(), buttons[ml].get(), bl::menu::Item::Bottom); }
457  }
458 }
459 
460 void PeoplemonMenu::chosen() {
461  bool closeMenu = true;
462 
463  switch (context) {
467  if (systems.player().state().peoplemon[mover1].currentHp() == 0) {
468  resetAction();
469  state = MenuState::ShowingMessage;
470  systems.hud().displayMessage("Unconscious Peoplemon can't fight!",
471  std::bind(&PeoplemonMenu::messageDone, this));
472  return;
473  }
474  break;
475 
477  if (systems.player().state().peoplemon[mover1].currentHp() != 0) {
478  resetAction();
479  state = MenuState::ShowingMessage;
481  "Choose a dead Peoplemon so the sacrifice was not in vain!",
482  std::bind(&PeoplemonMenu::messageDone, this));
483  return;
484  }
485  break;
486 
487  case Context::GiveItem:
488  if (systems.player().state().peoplemon[mover1].holdItem() != core::item::Id::None) {
489  resetAction();
490  state = MenuState::ShowingMessage;
491  systems.hud().displayMessage(systems.player().state().peoplemon[mover1].name() +
492  " is already holding something",
493  std::bind(&PeoplemonMenu::messageDone, this));
494  return;
495  }
496  break;
497 
498  case Context::UseItem:
499  closeMenu = false;
500  closeActionMenu();
501 
503  systems.player().state().peoplemon[mover1])) {
506  systems.player().state().bag.removeItem(useItem);
508  std::bind(&PeoplemonMenu::messageDone, this));
509  buttons[mover1]->sync(ppl);
510  state = MenuState::UsingItem;
511  }
514  if (mid != core::pplmn::MoveId::Unknown) {
516  const std::string move = core::pplmn::Move::name(mid);
517 
518  int i = -1;
519  for (int j = 0; j < 4; ++j) {
520  if (ppl.knownMoves()[j].id == core::pplmn::MoveId::Unknown) {
521  i = j;
522  break;
523  }
524  }
525 
526  // already knows 4 moves
527  if (i < 0) {
528  systems.hud().displayMessage(ppl.name() + " is trying to learn " + move +
529  " but already knows 4 moves.");
531  "Should " + ppl.name() + " forget a move to learn " + move + "?",
532  {"Yes", "No"},
533  std::bind(&PeoplemonMenu::confirmMoveDelete, this, std::placeholders::_1));
534  state = MenuState::WaitingForgetConfirm;
535  }
536  else {
537  systems.player().state().bag.removeItem(useItem);
538  ppl.knownMoves()[i] = core::pplmn::OwnedMove(mid);
539  systems.hud().displayMessage(ppl.name() + " learned " + move + "!",
540  std::bind(&PeoplemonMenu::messageDone, this));
541  state = MenuState::UsingItemWaitMessage;
542  }
543  }
544  else {
545  BL_LOG_ERROR << "Invalid tm: " << useItem;
546  systems.hud().displayMessage("Sorry but this TM is bunk.",
547  std::bind(&PeoplemonMenu::messageDone, this));
548  state = MenuState::ShowingMessage;
549  }
550  }
551  else {
552  resetAction();
553  state = MenuState::ShowingMessage;
554  systems.hud().displayMessage("It will not have any effect.",
555  std::bind(&PeoplemonMenu::messageDone, this));
556  }
557 
558  break;
559 
561  // no extra logic needed. if the item has no effect we just let them waste their turn
562  [[fallthrough]];
563 
564  default:
565  break;
566  }
567 
568  inputDriver.drive(nullptr);
569 
570  if (chosenPeoplemon) *chosenPeoplemon = mover1;
571  if (closeMenu) systems.engine().popState();
572 }
573 
574 void PeoplemonMenu::messageDone() {
575  switch (state) {
576  case MenuState::UsingItem:
577  state = MenuState::UsingItemWaitView;
578  break;
579  case MenuState::UsingItemWaitMessage:
580  systems.engine().popState();
581  break;
582  default:
583  state = MenuState::Browsing;
584  inputDriver.drive(&menu);
585  break;
586  }
587 }
588 
589 void PeoplemonMenu::confirmMoveDelete(const std::string& choice) {
590  auto& ppl = systems.player().state().peoplemon[mover1];
591  if (choice == "Yes") {
592  std::vector<std::string> moves;
593  moves.reserve(5);
594  for (int i = 0; i < 4; ++i) {
595  moves.emplace_back(core::pplmn::Move::name(ppl.knownMoves()[i].id));
596  }
597  moves.emplace_back("Cancel");
598 
599  systems.hud().promptUser("Which move should be forgotten?",
600  moves,
601  std::bind(&PeoplemonMenu::delMove, this, std::placeholders::_1));
602  state = MenuState::WaitingForgetChoice;
603  }
604  else {
605  const auto mid = core::item::Item::getTmMove(useItem);
606  systems.hud().displayMessage(ppl.name() + " did not learn " + core::pplmn::Move::name(mid) +
607  ".",
608  std::bind(&PeoplemonMenu::messageDone, this));
609  state = MenuState::ShowingMessage;
610  }
611 }
612 
613 void PeoplemonMenu::delMove(const std::string& mn) {
614  auto& ppl = systems.player().state().peoplemon[mover1];
615  const auto mid = core::item::Item::getTmMove(useItem);
616  const std::string nmn = core::pplmn::Move::name(mid);
617 
618  int i = -1;
619  for (int j = 0; j < 4; ++j) {
620  if (core::pplmn::Move::name(ppl.knownMoves()[j].id) == mn) {
621  i = j;
622  break;
623  }
624  }
625 
626  if (i >= 0) {
627  systems.player().state().bag.removeItem(useItem);
628  ppl.knownMoves()[i] = core::pplmn::OwnedMove(mid);
629  systems.hud().displayMessage("POOOOF! " + ppl.name() + " forgot " + mn + "!");
630  systems.hud().displayMessage(ppl.name() + " learned " + nmn + "!",
631  std::bind(&PeoplemonMenu::messageDone, this));
632  state = MenuState::UsingItemWaitMessage;
633  }
634  else {
635  systems.hud().displayMessage(ppl.name() + " did not learn " + nmn + ".",
636  std::bind(&PeoplemonMenu::messageDone, this));
637  state = MenuState::ShowingMessage;
638  }
639 }
640 
641 } // namespace state
642 } // namespace game
Id
Represents an item in its simplist form.
Definition: Id.hpp:24
@ TM
TM's. Covers ids [201, 499].
MoveId
The id of a move.
Definition: MoveId.hpp:16
Parent namespace for all functionality unique to the game.
Context
Represents where the menu is being opened from.
static std::string getUseLine(Id item, const pplmn::OwnedPeoplemon &ppl)
Returns the text to display when the item is used on the given peoplemon.
Definition: Item.cpp:327
static Category getCategory(Id item)
Returns the category of the given item.
Definition: Item.cpp:49
static pplmn::MoveId getTmMove(Id tm)
Returns the move taught by the TM.
Definition: Item.cpp:418
static const std::string & getName(item::Id item)
Returns the name of the given item.
Definition: Item.cpp:91
static void useOnPeoplemon(Id item, pplmn::OwnedPeoplemon &ppl, std::vector< pplmn::OwnedPeoplemon > *team=nullptr, std::vector< pplmn::BattlePeoplemon > *battleTeam=nullptr)
Applies the given item to the peoplemon.
Definition: Item.cpp:222
static bool hasEffectOnPeoplemon(Id item, const pplmn::OwnedPeoplemon &ppl)
Returns whether or not the given item will affect the peoplemon.
Definition: Item.cpp:144
static const std::string & name(MoveId move)
Returns the name of the given move.
Definition: Move.cpp:71
Represents a move owned by a peoplemon.
Definition: OwnedMove.hpp:17
MoveId id
The id of the move.
Definition: OwnedMove.hpp:19
Represents an instance of a peoplemon. Can be a wild peoplemon, trainer, or player peoplemon....
const OwnedMove * knownMoves() const
Returns the moves known by this Peoplemon.
const std::string & name() const
Returns the name of this peoplemon, custom or defualt.
static bool canLearnMove(Id ppl, MoveId move)
Returns whether or not the given Peoplemon can learn the given move.
Definition: Peoplemon.cpp:152
bool removeItem(item::Id item, unsigned int qty=1)
Removes the given item from the bag.
Definition: Bag.cpp:52
void addItem(item::Id item, unsigned int qty=1)
Adds the given item to the bag.
Definition: Bag.cpp:44
std::vector< pplmn::OwnedPeoplemon > peoplemon
Definition: State.hpp:46
player::Bag bag
Definition: State.hpp:44
static int WindowWidth()
Definition: Properties.cpp:250
static const sf::VulkanFont & MenuFont()
Definition: Properties.cpp:363
static bl::audio::AudioSystem::Handle MenuBackSound()
Definition: Properties.cpp:712
static const std::string & MenuImagePath()
Definition: Properties.cpp:303
static int WindowHeight()
Definition: Properties.cpp:256
void displayMessage(const std::string &message, const Callback &cb=[](const std::string &) {})
Displays a message in the HUD textbox. Messages are queued in order that they arrive.
Definition: HUD.cpp:92
void promptUser(const std::string &prompt, const std::vector< std::string > &choices, const Callback &cb)
Asks the player a question through the HUD.
Definition: HUD.cpp:112
player::State & state()
Returns the state of the player.
Definition: Player.cpp:154
Owns all primary systems and a reference to the engine.
Definition: Systems.hpp:47
const bl::engine::Engine & engine() const
Const accessor for the Engine.
Definition: Systems.cpp:35
Player & player()
Returns the player system.
Definition: Systems.cpp:59
HUD & hud()
Returns the HUD.
Definition: Systems.cpp:69
static Ptr create(const core::pplmn::OwnedPeoplemon &ppl)
Creates a new peoplemon button from the peoplemon.
std::shared_ptr< PeoplemonButton > Ptr
static bl::engine::State::Ptr create(core::system::Systems &systems, const core::pplmn::OwnedPeoplemon &ppl)
Create a new PeoplemonInfo engine state.
Provides the menu for viewing and selecting Peoplemon.
virtual void activate(bl::engine::Engine &engine) override
Subscribes the menu to the engine event bus.
virtual const char * name() const override
Returns "PeoplemonMenu".
virtual void update(bl::engine::Engine &, float dt, float) override
Does nothing.
virtual void deactivate(bl::engine::Engine &engine) override
Unsubscribes the menu to the engine event bus.
static bl::engine::State::Ptr create(core::system::Systems &systems, Context ctx, int outNow=-1, int *chosen=nullptr, core::item::Id item=core::item::Id::None)
Creates a new PeoplemonMenu state.
Parent to all game states. Provides some commonly required data like core game systems.
Definition: State.hpp:29
core::system::Systems & systems
Definition: State.hpp:66