18 return std::unexpected(expert.error());
22 next.expert = std::move(*expert);
23 next.expertLoaded =
true;
34 if (!
state.expertLoaded ||
state.directory.empty())
36 return std::unexpected(
Error{
39 "AI profile runtime is not initialized"});
43 return std::unexpected(
Error{
46 "AI player slot is out of range"});
52 return std::unexpected(
Error{
55 "AI token has no retail profile"});
60 return std::unexpected(
Error{
63 "AI level must be 1..3"});
66 if (
state.playerLoaded[player] &&
68 state.loadedLevel[player] == level)
75 return std::unexpected(
loaded.error());
78 state.playerLoaded[player] =
true;
80 state.loadedLevel[player] = level;
90 state.players[player] = {};
91 state.playerLoaded[player] =
false;
92 state.loadedToken[player] = 0;
93 state.loadedLevel[player] = 0;
102 return &
state.players[player];
108 return state.expertLoaded ? &
state.expert :
nullptr;
std::filesystem::path directory
std::expected< Profile, Error > load(const std::filesystem::path &path, int level)
std::expected< void, Error > initializeRuntime(RuntimeState &state, const std::filesystem::path &directory)
void clearPlayerRuntime(RuntimeState &state, rules::PlayerNumber player) noexcept
std::expected< void, Error > loadPlayerRuntime(RuntimeState &state, rules::PlayerNumber player, std::uint8_t token, std::uint8_t level)
const Profile * expertRuntimeProfile(const RuntimeState &state) noexcept
const Profile * playerRuntimeProfile(const RuntimeState &state, rules::PlayerNumber player) noexcept
void resetRuntime(RuntimeState &state) noexcept
std::string_view tokenFileName(std::uint8_t token) noexcept
std::uint8_t PlayerNumber
constexpr PlayerNumber MaxPlayers
std::filesystem::path directory