#include "gamecontext.h" #include "game/classicarrownote.h" #include "game/holdmanager.h" #include "graphics/animations/classicanimationscenario.h" #include "graphics/classicgraphicsmanager.h" GameContext::GameContext( const std::shared_ptr &hold_manager, const std::shared_ptr &graphics_manager) : _hold_manager(hold_manager), _graphics_manager(graphics_manager) { } void GameContext::input(ClassicArrowNote *note, kku::GameEvent &&input) const { auto grade = ClassicArrowNote::Grade::BAD; auto &elements = note->getElements(); bool input_valid = std::any_of( elements.begin(), elements.end(), [input = input](auto &element) { if (element.pressed) return false; const auto code = std::get(input.event.data).view; auto key_iterator = std::find(element.keys.begin(), element.keys.end(), code); bool found_key = key_iterator != element.keys.end(); if (found_key) { element.pressed = true; element.pressed_as = code; } return found_key; }); bool all_pressed = std::all_of(elements.begin(), elements.end(), [](const auto &element) { return element.pressed; }); if (all_pressed) { grade = note->calculatePrecision(input.timestamp); if (note->isHold()) _hold_manager->emplace(note); } if (all_pressed || !input_valid) { note->setState(ClassicArrowNote::State::DYING); for (auto &element : elements) element.animations[note->getState()]->launch( element.sprite, input.timestamp, note->getPerfectOffset()); } std::cout << "User input: " << static_cast(grade) << "\n"; } void GameContext::update(ClassicArrowNote *note, const kku::microsec &music_offset) const { auto &elements = note->getElements(); switch (note->getState()) { default: return; break; case ClassicArrowNote::State::INITIAL: note->setState(ClassicArrowNote::State::FLYING); _graphics_manager->update(music_offset, note); break; case ClassicArrowNote::State::FLYING: if (!note->isActive(music_offset) && music_offset > note->getPerfectOffset()) { note->setState(ClassicArrowNote::State::DYING); for (auto &element : elements) element.animations[note->getState()]->launch( element.sprite, music_offset, note->getPerfectOffset()); } break; case ClassicArrowNote::State::DYING: if (elements[0].animations[note->getState()]->isDone()) note->setState(ClassicArrowNote::State::DEAD); break; } for (auto &element : elements) if (element.animations[note->getState()]) element.animations[note->getState()]->update(music_offset); } std::shared_ptr GameContext::getHoldManager() const { return _hold_manager; } std::shared_ptr GameContext::getGraphicsManager() const { return _graphics_manager; }