Peoplemon  0.1.0
Peoplemon 3 game source documentation
Peopledex.cpp
Go to the documentation of this file.
2 
3 #include <Core/Properties.hpp>
4 #include <Core/Resources.hpp>
6 
7 namespace game
8 {
9 namespace state
10 {
11 namespace
12 {
13 const glm::vec2 MenuPos(420.f, 45.f);
14 constexpr float MenuWidth = -1.f;
15 constexpr float MenuHeight = 460.f;
16 constexpr float ArrowPadding = 2.f;
17 
18 constexpr float InfoTop = 60.f;
19 constexpr float InfoLeft = 25.f;
20 constexpr float InfoWidth = 375.f;
21 const glm::vec2 SeenBoxPos(InfoLeft, 485.f);
22 const glm::vec2 OwnBoxPos(InfoLeft, SeenBoxPos.y + 64.f);
23 constexpr float InfoPadding = 105.f;
24 
25 const sf::Color HiddenColor(255, 255, 255, 0);
26 const sf::Color ShowingColor(255, 255, 255, 255);
27 } // namespace
28 
29 bl::engine::State::Ptr Peopledex::create(core::system::Systems& s) { return Ptr(new Peopledex(s)); }
30 
31 Peopledex::Peopledex(core::system::Systems& s)
32 : State(s, bl::engine::StateMask::Menu) {
33  const std::string& ImgPath = core::Properties::MenuImagePath();
34  auto& joinPath = bl::util::FileUtil::joinPath;
35 
36  menu.create(s.engine(), s.engine().renderer().getObserver(), bl::menu::NoSelector::create());
37 
38  bgndTxtr = s.engine().renderer().texturePool().getOrLoadTexture(
39  joinPath(ImgPath, "Peopledex/background.png"));
40  background.create(s.engine(), bgndTxtr);
41 
42  seenTxtr = s.engine().renderer().texturePool().getOrLoadTexture(
43  joinPath(ImgPath, "Peopledex/seenBox.png"));
44  BL_LOG_INFO << "SeenBox texture: " << seenTxtr.id();
45  seenBox.create(s.engine(), seenTxtr);
46  seenBox.getTransform().setPosition(SeenBoxPos);
47  seenBox.setParent(background);
48 
49  seenLabel.create(s.engine(), core::Properties::MenuFont(), "", 26, sf::Color(20, 65, 245));
50  seenLabel.setParent(seenBox);
51  seenLabel.getTransform().setPosition(InfoPadding - 12.f, seenTxtr->size().y * 0.5f);
52 
53  ownedTxtr = s.engine().renderer().texturePool().getOrLoadTexture(
54  joinPath(ImgPath, "Peopledex/ownedBox.png"));
55  ownedBox.create(s.engine(), ownedTxtr);
56  ownedBox.getTransform().setPosition(OwnBoxPos);
57  ownedBox.setParent(background);
58 
59  ownedLabel.create(s.engine(), core::Properties::MenuFont(), "", 26, sf::Color::Red);
60  ownedLabel.setParent(ownedBox);
61  ownedLabel.getTransform().setPosition(InfoPadding, ownedTxtr->size().y * 0.5f);
62 
63  thumbTxtr = s.engine().renderer().texturePool().getOrLoadTexture(
65  thumbnail.create(s.engine(), thumbTxtr);
66  thumbnail.getTransform().setPosition(InfoLeft + InfoWidth * 0.5f, InfoTop + 20.f);
67  thumbnail.getTransform().setOrigin(100.f, 0.f);
68  thumbnail.setParent(background);
69 
70  nameLabel.create(s.engine(), core::Properties::MenuFont(), "", 26, sf::Color(0, 20, 65));
71  nameLabel.getTransform().setPosition(InfoLeft + 8.f, InfoTop + 245.f);
72  nameLabel.setParent(background);
73 
74  descLabel.create(s.engine(), core::Properties::MenuFont(), "", 18, sf::Color::Black);
75  descLabel.setParent(background);
76  descLabel.wordWrap(InfoWidth - 20.f);
77  descLabel.getTransform().setPosition(InfoLeft + 3.f, InfoTop + 275.f);
78 
79  locationLabel.create(s.engine(), core::Properties::MenuFont(), "", 22, sf::Color(0, 65, 20));
80  locationLabel.getTransform().setPosition(130.f, 442.f);
81  locationLabel.setParent(background);
82 
83  upTxtr = s.engine().renderer().texturePool().getOrLoadTexture(
84  joinPath(ImgPath, "Peopledex/upArrow.png"));
85  BL_LOG_INFO << "UpArrow texture: " << upTxtr.id();
86  upArrow.create(s.engine(), upTxtr);
87  upArrow.getTransform().setOrigin(0.f, upTxtr->size().y);
88  upArrow.setParent(background);
89 
90  downTxtr = s.engine().renderer().texturePool().getOrLoadTexture(
91  joinPath(ImgPath, "Peopledex/downArrow.png"));
92  downArrow.create(s.engine(), downTxtr);
93  downArrow.setParent(background);
94 
95  const auto& all = core::pplmn::Peoplemon::validIds();
96  firstId = all[1];
97  lastId = all.back();
98 
99  bl::menu::Item::Ptr first = makeRow(all[1]); // skip id 0
100  bl::menu::Item* prev = first.get();
101  menu.setRootItem(first);
102  for (unsigned int i = 2; i < all.size(); ++i) {
103  bl::menu::Item::Ptr row = makeRow(all[i]);
104  menu.addItem(row, prev, bl::menu::Item::Bottom);
105  prev = row.get();
106  }
107 
108  menu.setPosition(MenuPos);
109  menu.setMaximumSize({MenuWidth, MenuHeight});
110  menu.setSelectedItem(first.get());
111  menuDriver.drive(&menu);
112  const float mw = menu.getBounds().width;
113 
114  upArrow.getTransform().setPosition(MenuPos + glm::vec2(mw * 0.5f, -ArrowPadding));
115  downArrow.getTransform().setPosition(MenuPos.x + mw * 0.5f,
116  static_cast<float>(core::Properties::WindowHeight()) -
117  downTxtr->size().y - 5.f);
118 }
119 
120 const char* Peopledex::name() const { return "Peopledex"; }
121 
122 void Peopledex::activate(bl::engine::Engine& engine) {
123  systems.engine().inputSystem().getActor().addListener(*this);
124 
125  auto overlay = engine.renderer().getObserver().pushScene<bl::rc::Overlay>();
126  background.addToScene(overlay, bl::rc::UpdateSpeed::Static);
127  upArrow.addToScene(overlay, bl::rc::UpdateSpeed::Static);
128  downArrow.addToScene(overlay, bl::rc::UpdateSpeed::Static);
129  seenBox.addToScene(overlay, bl::rc::UpdateSpeed::Static);
130  seenLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
131  ownedBox.addToScene(overlay, bl::rc::UpdateSpeed::Static);
132  ownedLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
133  thumbnail.addToScene(overlay, bl::rc::UpdateSpeed::Static);
134  nameLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
135  descLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
136  locationLabel.addToScene(overlay, bl::rc::UpdateSpeed::Static);
137  menu.addToOverlay(background.entity());
138 }
139 
140 void Peopledex::deactivate(bl::engine::Engine& engine) {
141  systems.engine().inputSystem().getActor().removeListener(*this);
142  engine.renderer().getObserver().popScene();
143 }
144 
145 void Peopledex::update(bl::engine::Engine&, float, float) {}
146 
147 bool Peopledex::observe(const bl::input::Actor&, unsigned int ctrl, bl::input::DispatchType,
148  bool fromEvent) {
149  if (ctrl == core::input::Control::Back && fromEvent) { systems.engine().popState(); }
150  else { menuDriver.sendControl(ctrl, fromEvent); }
151  return true;
152 }
153 
154 void Peopledex::onHighlight(core::pplmn::Id ppl) {
156  nameLabel.getSection().setString(core::pplmn::Peoplemon::name(ppl));
157  descLabel.getSection().setString(core::pplmn::Peoplemon::description(ppl));
158  thumbTxtr = systems.engine().renderer().texturePool().getOrLoadTexture(
160  }
161  else {
162  nameLabel.getSection().setString("???");
163  descLabel.getSection().setString("");
164  thumbTxtr = systems.engine().renderer().texturePool().getOrLoadTexture(
166  }
167  thumbnail.getTransform().setScale(200.f / thumbTxtr->size());
168  thumbnail.setTexture(thumbTxtr);
169 
170  locationLabel.getSection().setString(
172  seenLabel.getSection().setString(
173  std::to_string(systems.player().state().peopledex.getSeen(ppl)));
174  seenLabel.getTransform().setOrigin(
175  0.f, seenLabel.getLocalBounds().height * 0.5f + seenLabel.getLocalBounds().top * 0.5f);
176  ownedLabel.getSection().setString(
177  std::to_string(systems.player().state().peopledex.getCaught(ppl)));
178  ownedLabel.getTransform().setOrigin(
179  0.f, ownedLabel.getLocalBounds().height * 0.5f + ownedLabel.getLocalBounds().top * 0.5f);
180 
181  upArrow.setHidden(ppl == firstId);
182  downArrow.setHidden(ppl == lastId);
183 }
184 
185 void Peopledex::onSelect(core::pplmn::Id) {
186  // TODO - open info screen
187 }
188 
189 bl::menu::Item::Ptr Peopledex::makeRow(core::pplmn::Id ppl) {
192  row->getSignal(bl::menu::Item::Activated)
193  .willAlwaysCall(std::bind(&Peopledex::onSelect, this, ppl));
194  row->getSignal(bl::menu::Item::Selected)
195  .willAlwaysCall(std::bind(&Peopledex::onHighlight, this, ppl));
196  return row;
197 }
198 
199 } // namespace state
200 } // namespace game
Id
The id of a peoplemon.
Definition: Id.hpp:16
Parent namespace for all functionality unique to the game.
static const std::string & description(Id id)
Returns the description of the given Peoplemon.
Definition: Peoplemon.cpp:131
static const std::vector< Id > & validIds()
Returtns the list of all valid ids.
Definition: Peoplemon.cpp:118
static const std::string & name(Id id)
Returns the name of the given Peoplemon.
Definition: Peoplemon.cpp:126
static std::string thumbnailImage(Id id)
Returns the path of the image to render as the peoplemon thumbnail.
Definition: Peoplemon.cpp:211
const std::string & getFirstSeenLocation(pplmn::Id peoplemon) const
Returns the name of the location the given peoplemon was first spotted at.
Definition: Peopledex.cpp:17
IntelLevel getIntelLevel(pplmn::Id peoplemon) const
Returns the level of intel on the given peoplemon.
Definition: Peopledex.cpp:42
unsigned int getSeen(pplmn::Id peoplemon) const
Returns how many of the given peoplemon have been seen.
Definition: Peopledex.cpp:12
unsigned int getCaught(pplmn::Id peoplemon) const
Returns how many of the given peoplemon have been caught.
Definition: Peopledex.cpp:26
Peopledex peopledex
Definition: State.hpp:49
static const sf::VulkanFont & MenuFont()
Definition: Properties.cpp:363
static const std::string & MenuImagePath()
Definition: Properties.cpp:303
static int WindowHeight()
Definition: Properties.cpp:256
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
static Ptr create(core::pplmn::Id ppl, const core::player::Peopledex &dex)
Create a new peopledex row.
std::shared_ptr< PeopledexRow > Ptr
Pointer to the row item.
The peopledex menu state.
Definition: Peopledex.hpp:20
virtual void deactivate(bl::engine::Engine &engine) override
Deactivates the state.
Definition: Peopledex.cpp:140
virtual void update(bl::engine::Engine &engine, float dt, float) override
Updates the state and menus and whatnot.
Definition: Peopledex.cpp:145
virtual void activate(bl::engine::Engine &engine) override
Activates the state.
Definition: Peopledex.cpp:122
static bl::engine::State::Ptr create(core::system::Systems &systems)
Create a new Peopledex state.
Definition: Peopledex.cpp:29
virtual const char * name() const override
Returns "Peopledex".
Definition: Peopledex.cpp:120
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