#ifndef DYNAMIC_PROGRAM_DOWNLOAD_H #define DYNAMIC_PROGRAM_DOWNLOAD_H #include #include #include #include #include #include "game_state.h" #include "myassert.h" namespace Hanabi { Card tag_invoke(boost::json::value_to_tag, boost::json::value const &jv); void tag_invoke(boost::json::value_from_tag, boost::json::value &jv, Hanabi::Card const &card); } namespace Download { struct Action { Hanabi::ActionType type{}; uint8_t target{}; }; Action tag_invoke(boost::json::value_to_tag, boost::json::value const &jv); std::pair, Hanabi::rank_t> parse_deck(const boost::json::value &deck_json); std::vector parse_actions(const boost::json::value &action_json); std::optional download_game_json(int game_id); std::optional open_game_json(const char *filename); /** * @brief Create game object from given source * @param game_spec Either an id to download from hanab.live or a filename with a json specification * @param turn Turn to skip to * @param draw_pile_break Minimum draw pile size of produced game * @return Game state * * If both turn and draw_pile_break are specified, the game skips until the specified turn or the first time the * draw pile hits the given size, whichever comes first * * @note Turns start counting at 1, since this is also the way hanab.live does it. */ std::unique_ptr get_game(std::variant game_spec, unsigned turn = 1, size_t draw_pile_break = 0); } // namespace Download #endif // DYNAMIC_PROGRAM_DOWNLOAD_H