#ifndef __STATE_HPP_ #define __STATE_HPP_ #include "config.hpp" #include "distance.hpp" #include "physics.hpp" #include "puzzle.hpp" #include #include #include class StateManager { public: ThreadedPhysics &physics; std::vector presets; // Some stuff is faster to map from state to mass (e.g. in the renderer) std::unordered_map states; std::unordered_set winning_states; std::unordered_set visited_states; // Other stuff maps from mass to state :/ std::unordered_map masses; std::vector winning_path; // Fuck it, duplicate the springs too, we don't even need to copy them from // the physics thread then... std::vector> springs; // Distance calculation result can be buffered and reused to calculate a new // path on the same graph DistanceResult target_distances; int current_preset; State starting_state; State current_state; State previous_state; bool edited = false; public: StateManager(ThreadedPhysics &_physics, const std::string &preset_file) : physics(_physics), presets({State()}), current_preset(0), edited(false) { ParsePresetFile(preset_file); current_state = presets.at(current_preset); ClearGraph(); } StateManager(const StateManager ©) = delete; StateManager &operator=(const StateManager ©) = delete; StateManager(StateManager &&move) = delete; StateManager &operator=(StateManager &&move) = delete; ~StateManager() {} private: auto ParsePresetFile(const std::string &preset_file) -> void; public: auto LoadPreset(int preset) -> void; auto ResetState() -> void; auto PreviousPreset() -> void; auto NextPreset() -> void; auto NextPath() -> void; auto FillGraph() -> void; auto UpdateGraph() -> void; auto ClearGraph() -> void; auto FindWinningStates() -> void; auto FindTargetDistances() -> void; auto FindTargetPath() -> void; auto FindWorstState() -> State; auto GoToWorst() -> void; auto CurrentMassIndex() const -> std::size_t; }; #endif