Peoplemon  0.1.0
Peoplemon 3 game source documentation
LoadGame.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 constexpr float FadeTime = 1.5f;
14 }
15 
16 using namespace bl::menu;
17 
18 LoadGame::Ptr LoadGame::create(core::system::Systems& s) { return Ptr(new LoadGame(s)); }
19 
20 LoadGame::LoadGame(core::system::Systems& s)
21 : State(s, bl::engine::StateMask::Menu)
22 , state(SelectingSave)
23 , selectedSave(0)
24 , fadeout(nullptr) {}
25 
26 const char* LoadGame::name() const { return "LoadGame"; }
27 
28 void LoadGame::activate(bl::engine::Engine& engine) {
29  if (!bgndTxtr) {
30  bgndTxtr = engine.renderer().texturePool().getOrLoadTexture(bl::util::FileUtil::joinPath(
31  core::Properties::MenuImagePath(), "LoadGame/loadGameBgnd.png"));
32  background.create(engine, bgndTxtr);
33 
34  saveMenu.create(
35  engine, engine.renderer().getObserver(), ArrowSelector::create(12.f, sf::Color::Black));
36  saveMenu.configureBackground(
37  sf::Color::White, sf::Color::Black, 3.f, {22.f, 4.f, 4.f, 6.f});
38  saveMenu.setMinHeight(30.f);
39  saveMenu.setPosition({170.f, 200.f});
40  saveMenu.setMaximumSize({-1.f, 250.f});
41 
42  actionMenu.create(
43  engine, engine.renderer().getObserver(), ArrowSelector::create(12.f, sf::Color::Black));
44  Item::Ptr load =
45  TextItem::create("Load", core::Properties::MenuFont(), sf::Color::Black, 26);
46  load->getSignal(Item::Activated).willAlwaysCall([this]() {
47  inputDriver.drive(nullptr);
48  state = Fading;
49  fadeout = systems.engine()
50  .renderer()
51  .getObserver()
52  .getRenderGraph()
53  .putTask<bl::rc::rgi::FadeEffectTask>(FadeTime);
54  });
55  Item::Ptr del =
56  TextItem::create("Delete", core::Properties::MenuFont(), sf::Color::Black, 26);
57  del->getSignal(Item::Activated).willAlwaysCall([this]() { state = SaveDeleted; });
58  Item::Ptr back =
59  TextItem::create("Back", core::Properties::MenuFont(), sf::Color(140, 0, 0), 26);
60  back->getSignal(Item::Activated).willAlwaysCall([this]() {
61  observe(systems.engine().inputSystem().getActor(),
63  bl::input::DispatchType::TriggerActivated,
64  true);
65  });
66  actionMenu.setMinHeight(28.f);
67  actionMenu.setRootItem(load);
68  actionMenu.addItem(del, load.get(), Item::Bottom);
69  actionMenu.addItem(back, del.get(), Item::Bottom);
70  actionMenu.configureBackground(
71  sf::Color::White, sf::Color::Black, 3.f, {22.f, 2.f, 2.f, 2.f});
72  }
73 
74  scene = engine.renderer().getObserver().pushScene<bl::rc::Overlay>();
75  reset();
76 }
77 
78 void LoadGame::deactivate(bl::engine::Engine& engine) {
79  engine.renderer().getObserver().removeScene(scene);
80  systems.engine().inputSystem().getActor().removeListener(inputDriver);
81  systems.engine().inputSystem().getActor().removeListener(*this);
82 }
83 
84 void LoadGame::update(bl::engine::Engine& engine, float dt, float) {
85  switch (state) {
86  case SaveDeleted:
87  if (saves[selectedSave].remove()) { reset(); }
88  else {
89  systems.hud().displayMessage("Failed to delete game save",
90  std::bind(&LoadGame::errorDone, this));
91  inputDriver.drive(nullptr);
92  state = Error;
93  }
94  break;
95 
96  case Fading:
97  if (fadeout->complete()) {
98  engine.renderer()
99  .getObserver()
100  .getRenderGraph()
101  .removeTask<bl::rc::rgi::FadeEffectTask>();
102  if (saves[selectedSave].load()) {
103  systems.engine().replaceState(MainGame::create(systems));
104  }
105  else {
106  systems.hud().displayMessage("Failed to load game save",
107  std::bind(&LoadGame::errorDone, this));
108  inputDriver.drive(nullptr);
109  state = Error;
110  }
111  }
112  break;
113 
114  case Error:
115  break;
116 
117  case SelectingSave:
118  case ChooseAction:
119  break;
120 
121  default:
122  state = SelectingSave;
123  inputDriver.drive(&saveMenu);
124  break;
125  }
126 }
127 
128 bool LoadGame::observe(const bl::input::Actor&, unsigned int activatedControl,
129  bl::input::DispatchType, bool fromEvent) {
130  if (activatedControl == core::input::Control::Back && fromEvent) {
131  switch (state) {
132  case SelectingSave:
133  bl::audio::AudioSystem::playOrRestartSound(core::Properties::MenuBackSound());
134  systems.engine().popState();
135  break;
136 
137  case ChooseAction:
138  state = SelectingSave;
139  bl::audio::AudioSystem::playOrRestartSound(core::Properties::MenuBackSound());
140  inputDriver.drive(&saveMenu);
141  actionMenu.setHidden(true);
142  break;
143 
144  default:
145  break;
146  }
147  }
148  return true;
149 }
150 
151 void LoadGame::saveSelected(unsigned int i) {
152  selectedSave = i;
153  state = ChooseAction;
154  inputDriver.drive(&actionMenu);
155  const glm::vec2 pos(170.f + saveMenu.getBounds().width + 40.f,
156  200.f + static_cast<float>(i) * 26.f + 32.f);
157  actionMenu.setPosition(pos + glm::vec2(22.f, 14.f));
158  actionMenu.setHidden(false);
159 }
160 
161 void LoadGame::errorDone() { reset(); }
162 
163 void LoadGame::reset() {
164  saves.clear();
166 
167  Item::Ptr item =
168  TextItem::create("Back", core::Properties::MenuFont(), sf::Color(140, 0, 0), 26);
169  item->getSignal(Item::Activated).willAlwaysCall([this]() {
170  observe(systems.engine().inputSystem().getActor(),
172  bl::input::DispatchType::TriggerActivated,
173  true);
174  });
175  saveMenu.setRootItem(item);
176 
177  for (unsigned int i = 0; i < saves.size(); ++i) {
178  const auto& save = saves[i];
179 
180  Item::Ptr it =
181  TextItem::create(save.saveName, core::Properties::MenuFont(), sf::Color::Black, 26);
182  it->getSignal(Item::Activated).willAlwaysCall([this, i]() { saveSelected(i); });
183  saveMenu.addItem(it, item.get(), Item::Top);
184  item = it;
185  }
186  saveMenu.setSelectedItem(item.get());
187 
188  bl::rc::Overlay* overlay = systems.engine().renderer().getObserver().getCurrentOverlay();
189  background.addToScene(overlay, bl::rc::UpdateSpeed::Static);
190  saveMenu.addToOverlay(background.entity());
191  actionMenu.addToOverlay(background.entity());
192  actionMenu.setHidden(true);
193 
194  state = SelectingSave;
195  inputDriver.drive(&saveMenu);
196  systems.engine().inputSystem().getActor().addListener(*this);
197  systems.engine().inputSystem().getActor().addListener(inputDriver);
198 }
199 
200 } // namespace state
201 } // namespace game
Parent namespace for all functionality unique to the game.
static void listSaves(std::vector< GameSave > &result)
Lists all saves in the save directory.
Definition: GameSave.cpp:40
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
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
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
HUD & hud()
Returns the HUD.
Definition: Systems.cpp:69
Provides a menu to select a save and loads the selected save.
Definition: LoadGame.hpp:21
virtual void activate(bl::engine::Engine &engine) override
Activates the state.
Definition: LoadGame.cpp:28
static bl::engine::State::Ptr create(core::system::Systems &systems)
Creates the load game state.
Definition: LoadGame.cpp:18
virtual void deactivate(bl::engine::Engine &engine) override
Deactivates the state.
Definition: LoadGame.cpp:78
virtual void update(bl::engine::Engine &engine, float dt, float) override
Updates the state and menus and whatnot.
Definition: LoadGame.cpp:84
virtual const char * name() const override
Returns "LoadGame".
Definition: LoadGame.cpp:26
static bl::engine::State::Ptr create(core::system::Systems &systems)
Creates the main game state. The game state must be initialized before invoking the main game state.
Definition: MainGame.cpp:35
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