Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
IBarJailCardPlayback.cpp
Go to the documentation of this file.
2
3#include <memory>
4#include <utility>
5#include <variant>
6#include <vector>
7
8namespace monopoly::ibar
9{
10 std::expected<void, std::string> JailCardPlayback::sync(
15 {
16 std::array<data::DataId, 2> desired{};
18 {
19 for (std::size_t deck = 0; deck < desired.size(); ++deck)
20 {
21 if (state.cards[deck].jailOwner == activePlayer)
23 }
24 }
25
26 if (desired == current_)
27 return {};
28
29 std::array<std::shared_ptr<const sequence::SequenceProgram>, 2> programs{};
30 for (std::size_t deck = 0; deck < desired.size(); ++deck)
31 {
32 if (desired[deck] == data::EmptyDataId || desired[deck] == current_[deck])
33 continue;
35 if (!loaded)
36 return std::unexpected(loaded.error().detail);
37 programs[deck] = std::move(*loaded);
38 }
39
40 std::vector<sequence::SequenceCommand> commands;
41 for (std::size_t deck = 0; deck < desired.size(); ++deck)
42 {
43 if (desired[deck] == current_[deck])
44 continue;
45 const auto priority = static_cast<std::uint16_t>(JailCardBasePriority + deck);
46 if (current_[deck] != data::EmptyDataId)
47 commands.push_back(sequence::StopSequenceCommand{current_[deck], priority, false});
49 {
50 commands.push_back(sequence::StartSequenceCommand{programs[deck], priority, {}});
51 commands.push_back(sequence::makeMoveXY(
53 }
54 }
55
56 if (commands.size() > sequence::SequenceCommandQueue::Capacity -
57 playback.commands().pendingCount())
58 return std::unexpected("sequence command queue cannot fit IBar jail-card transition");
59
60 for (auto& command : commands)
61 {
62 const auto queued = std::visit(
63 [&](auto value) { return playback.commands().enqueue(std::move(value)); },
64 std::move(command));
65 if (!queued)
66 return std::unexpected("validated IBar jail-card command rejected");
67 }
68
69 current_ = desired;
70 return {};
71 }
72}
std::uint16_t priority
unsigned index
std::uint16_t value
Definition Timers.cpp:16
std::expected< void, std::string > sync(const rules::GameState &state, bool propertyBarAvailable, rules::PlayerNumber activePlayer, 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={})
constexpr DataId EmptyDataId
Definition DataBanks.hpp:13
constexpr std::uint16_t JailCardBasePriority
constexpr std::array< std::int32_t, 2 > JailCardX
constexpr std::array< std::int32_t, 2 > JailCardY
State & state()
Definition IBar.cpp:1285
constexpr data::DataId jailCardSequence(std::size_t deck) noexcept
std::uint8_t PlayerNumber
Definition RuleTypes.hpp:12
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