Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
OptionsOptionPlayback.cpp
Go to the documentation of this file.
2
3#include <array>
4#include <memory>
5#include <utility>
6#include <variant>
7#include <vector>
8
10{
11 std::expected<void, std::string> OptionPlayback::sync(
12 const State& state,
15 {
16 const bool desiredVisible =
18 state.active && state.currentScreen == Screen::Option;
19 if (desiredVisible == visible_)
20 return {};
21
22 std::array<std::shared_ptr<const sequence::SequenceProgram>, 4> programs{};
24 {
25 for (std::size_t index = 0; index < OptionScreenTags.size(); ++index)
26 {
29 if (!loaded)
30 return std::unexpected(loaded.error().detail);
31 programs[index] = std::move(*loaded);
32 }
33 }
34
35 std::vector<sequence::SequenceCommand> commands;
37 {
38 for (std::size_t index = 0; index < OptionScreenTags.size(); ++index)
39 {
40 const auto id = optionSequence(OptionScreenTags[index]);
41 commands.push_back(sequence::StartSequenceCommand{
44 {
45 commands.push_back(sequence::makeMoveXY(
49 }
50 }
51 }
52 else
53 {
54 for (const auto tag : OptionScreenTags)
55 {
56 commands.push_back(sequence::StopSequenceCommand{
58 }
59 }
60
61 if (commands.size() > sequence::SequenceCommandQueue::Capacity -
62 playback.commands().pendingCount())
63 {
64 return std::unexpected(
65 "sequence command queue cannot fit Options Option-screen transition");
66 }
67
68 for (auto& command : commands)
69 {
70 const auto queued = std::visit(
71 [&](auto value)
72 {
73 return playback.commands().enqueue(std::move(value));
74 },
75 std::move(command));
76 if (!queued)
77 return std::unexpected(
78 "validated Options Option-screen command rejected");
79 }
80
81 visible_ = desiredVisible;
82 return {};
83 }
84}
data::DataId id
unsigned state
unsigned index
std::uint16_t value
Definition Timers.cpp:16
std::expected< void, std::string > sync(const State &state, display::Screen2D desiredView, 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 std::uint16_t OptionScreenPriority
constexpr data::DataTag OptionOkayInTag
constexpr data::DataId optionSequence(data::DataTag tag) noexcept
constexpr std::array< data::DataTag, 4 > OptionScreenTags
constexpr std::uint8_t OptionScreenStayAtEnd
MoveSequenceCommand makeMoveXY(data::DataId dataId, std::uint16_t priority, std::int32_t x, std::int32_t y) noexcept