Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
OptionsFilePlayback.cpp
Go to the documentation of this file.
2
3#include <memory>
4#include <utility>
5#include <variant>
6#include <vector>
7
9{
10 namespace
11 {
12 [[nodiscard]] std::array<data::DataId, 6> fileSequences() noexcept
13 {
14 std::array<data::DataId, 6> ids{};
16 for (std::size_t index = 0; index < FileButtonInTags.size(); ++index)
18 return ids;
19 }
20 }
21
22 std::expected<void, std::string> FilePlayback::sync(
23 const State& state,
26 {
27 const bool desiredVisible =
29 state.active && state.currentScreen == Screen::File;
30 if (desiredVisible == visible_)
31 return {};
32
33 const auto ids = fileSequences();
34 std::array<std::shared_ptr<const sequence::SequenceProgram>, 6> programs{};
36 {
37 for (std::size_t index = 0; index < ids.size(); ++index)
38 {
40 playback.resources(), ids[index]);
41 if (!loaded)
42 return std::unexpected(loaded.error().detail);
43 programs[index] = std::move(*loaded);
44 }
45 }
46
47 std::vector<sequence::SequenceCommand> commands;
49 {
50 for (std::size_t index = 0; index < ids.size(); ++index)
51 {
52 commands.push_back(sequence::StartSequenceCommand{
56 }
57 }
58 else
59 {
60 for (const auto id : ids)
61 {
62 commands.push_back(sequence::StopSequenceCommand{
63 id, FileScreenPriority, false});
64 }
65 }
66
67 if (commands.size() > sequence::SequenceCommandQueue::Capacity -
68 playback.commands().pendingCount())
69 {
70 return std::unexpected(
71 "sequence command queue cannot fit Options File-screen transition");
72 }
73
74 for (auto& command : commands)
75 {
76 const auto queued = std::visit(
77 [&](auto value)
78 {
79 return playback.commands().enqueue(std::move(value));
80 },
81 std::move(command));
82 if (!queued)
83 return std::unexpected(
84 "validated Options File-screen command rejected");
85 }
86
87 visible_ = desiredVisible;
88 return {};
89 }
90}
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::uint8_t FileScreenStayAtEnd
constexpr data::DataTag FileTitleTag
constexpr data::DataId fileSequence(data::DataTag tag) noexcept
constexpr std::uint16_t FileScreenPriority
constexpr std::array< data::DataTag, 5 > FileButtonInTags