Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
AIProfileRuntime.cpp
Go to the documentation of this file.
2
3#include <utility>
4
6{
8 {
9 state = {};
10 }
11
12 std::expected<void, Error> initializeRuntime(
14 const std::filesystem::path& directory)
15 {
16 auto expert = load(directory / "Normal.ai", 3);
17 if (!expert)
18 return std::unexpected(expert.error());
19
22 next.expert = std::move(*expert);
23 next.expertLoaded = true;
24 state = std::move(next);
25 return {};
26 }
27
28 std::expected<void, Error> loadPlayerRuntime(
31 std::uint8_t token,
32 std::uint8_t level)
33 {
34 if (!state.expertLoaded || state.directory.empty())
35 {
36 return std::unexpected(Error{
38 0,
39 "AI profile runtime is not initialized"});
40 }
41 if (player >= rules::MaxPlayers)
42 {
43 return std::unexpected(Error{
45 0,
46 "AI player slot is out of range"});
47 }
48
49 const auto fileName = tokenFileName(token);
50 if (fileName.empty())
51 {
52 return std::unexpected(Error{
54 0,
55 "AI token has no retail profile"});
56 }
57
59 {
60 return std::unexpected(Error{
62 0,
63 "AI level must be 1..3"});
64 }
65
66 if (state.playerLoaded[player] &&
67 state.loadedToken[player] == token &&
68 state.loadedLevel[player] == level)
69 {
70 return {};
71 }
72
73 auto loaded = load(state.directory / fileName, level);
74 if (!loaded)
75 return std::unexpected(loaded.error());
76
77 state.players[player] = std::move(*loaded);
78 state.playerLoaded[player] = true;
79 state.loadedToken[player] = token;
80 state.loadedLevel[player] = level;
81 return {};
82 }
83
86 rules::PlayerNumber player) noexcept
87 {
88 if (player >= rules::MaxPlayers)
89 return;
90 state.players[player] = {};
91 state.playerLoaded[player] = false;
92 state.loadedToken[player] = 0;
93 state.loadedLevel[player] = 0;
94 }
95
97 const RuntimeState& state,
98 rules::PlayerNumber player) noexcept
99 {
100 if (player >= rules::MaxPlayers || !state.playerLoaded[player])
101 return nullptr;
102 return &state.players[player];
103 }
104
106 const RuntimeState& state) noexcept
107 {
108 return state.expertLoaded ? &state.expert : nullptr;
109 }
110}
unsigned state
unsigned index
int token
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
Definition RuleTypes.hpp:12
constexpr PlayerNumber MaxPlayers
Definition RuleTypes.hpp:14