Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
IBarCurrentPlayerPlayback.cpp
Go to the documentation of this file.
2
3#include <utility>
4#include <variant>
5#include <vector>
6
7namespace monopoly::ibar
8{
9 std::expected<data::DataId, std::string>
12 bool visible)
13 {
14 if (!visible ||
15 state.currentPlayer >= state.numberOfPlayers ||
16 state.currentPlayer >= rules::MaxPlayers)
17 {
18 return data::EmptyDataId;
19 }
20
21 const auto token = state.players[state.currentPlayer].token;
23 {
24 return std::unexpected(
25 "current IBar player token is outside the legacy token range");
26 }
27
28 return data::packDataId(
30 static_cast<data::DataTag>(
32 }
33
34 std::expected<void, std::string> CurrentPlayerPlayback::sync(
36 bool visible,
38 {
39 const auto resolved = desiredCurrentPlayerToken(state, visible);
40 if (!resolved)
41 {
42 return std::unexpected(resolved.error());
43 }
44
46 if (desired == currentToken_)
47 {
48 return {};
49 }
50
51 std::shared_ptr<const sequence::SequenceProgram> program;
53 {
55 playback.resources(), desired);
56 if (!loaded)
57 {
58 return std::unexpected(loaded.error().detail);
59 }
60 program = std::move(*loaded);
61 }
62
63 std::vector<sequence::SequenceCommand> commands;
64 if (currentToken_ != data::EmptyDataId)
65 {
66 commands.push_back(sequence::StopSequenceCommand{
67 currentToken_, CurrentPlayerTokenPriority, false});
68 }
69
71 {
72 commands.push_back(sequence::StartSequenceCommand{
73 program, CurrentPlayerTokenPriority, {}});
74 commands.push_back(sequence::makeMoveXY(
79 LoopToBeginning, false});
80 }
81
82 if (commands.size() >
84 playback.commands().pendingCount())
85 {
86 return std::unexpected(
87 "sequence command queue cannot fit current IBar player transition");
88 }
89
90 for (auto& command : commands)
91 {
92 const auto queued = std::visit(
93 [&](auto value)
94 {
95 return playback.commands().enqueue(std::move(value));
96 },
97 std::move(command));
98
99 if (!queued)
100 {
101 return std::unexpected(
102 "validated current IBar player command rejected");
103 }
104 }
105
106 currentToken_ = desired;
107 return {};
108 }
109}
unsigned index
int token
std::uint16_t value
Definition Timers.cpp:16
std::expected< void, std::string > sync(const rules::GameState &state, bool visible, engine::SequencePlayback &playback)
static std::expected< std::shared_ptr< const SequenceProgram >, RuntimeError > load(const data::DataSource &source, data::DataId id, std::size_t offset=0, DescriptionLimits limits={})
std::uint32_t DataId
Definition DataBanks.hpp:10
constexpr DataId EmptyDataId
Definition DataBanks.hpp:13
std::uint16_t DataTag
Definition DataBanks.hpp:11
constexpr DataId packDataId(std::uint16_t group, DataTag tag) noexcept
Definition DataBanks.hpp:39
constexpr std::int32_t CurrentPlayerTokenY
constexpr std::uint8_t LoopToBeginning
std::expected< data::DataId, std::string > desiredCurrentPlayerToken(const rules::GameState &state, bool visible)
constexpr std::uint16_t CurrentPlayerTokenPriority
constexpr std::int32_t CurrentPlayerTokenX
State & state()
Definition IBar.cpp:1285
constexpr data::DataTag CurrentPlayerTokenBaseTag
constexpr std::size_t MaxTokens
Definition RuleTypes.hpp:30
constexpr PlayerNumber MaxPlayers
Definition RuleTypes.hpp:14
MoveSequenceCommand makeMoveXY(data::DataId dataId, std::uint16_t priority, std::int32_t x, std::int32_t y) noexcept
std::array< PlayerDisplay, rules::MaxPlayers > players
Definition IBar.hpp:34