Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
OptionsHelpPlayback.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 namespace
12 {
13 [[nodiscard]] std::array<data::DataId, 4> helpSequences() noexcept
14 {
15 std::array<data::DataId, 4> ids{};
17 for (std::size_t index = 0; index < HelpButtonInTags.size(); ++index)
19 return ids;
20 }
21 }
22
23 std::expected<void, std::string> HelpPlayback::sync(
24 const State& state,
27 {
28 const bool desiredVisible =
30 state.active && state.currentScreen == Screen::Help && !state.quickHelpVisible;
31 if (desiredVisible == visible_)
32 return {};
33
34 const auto ids = helpSequences();
35 std::array<std::shared_ptr<const sequence::SequenceProgram>, 4> programs{};
37 {
38 for (std::size_t index = 0; index < ids.size(); ++index)
39 {
41 playback.resources(), ids[index]);
42 if (!loaded)
43 return std::unexpected(loaded.error().detail);
44 programs[index] = std::move(*loaded);
45 }
46 }
47
48 std::vector<sequence::SequenceCommand> commands;
50 {
51 commands.push_back(sequence::StartSequenceCommand{
53 for (std::size_t index = 1; index < ids.size(); ++index)
54 {
55 commands.push_back(sequence::StartSequenceCommand{
59 }
60 }
61 else
62 {
63 for (const auto id : ids)
64 commands.push_back(sequence::StopSequenceCommand{
65 id, HelpScreenPriority, false});
66 }
67
68 if (commands.size() > sequence::SequenceCommandQueue::Capacity -
69 playback.commands().pendingCount())
70 return std::unexpected(
71 "sequence command queue cannot fit Options Help-screen transition");
72
73 for (auto& command : commands)
74 {
75 const auto queued = std::visit(
76 [&](auto value)
77 {
78 return playback.commands().enqueue(std::move(value));
79 }, std::move(command));
80 if (!queued)
81 return std::unexpected("validated Options Help-screen command rejected");
82 }
83
84 visible_ = desiredVisible;
85 return {};
86 }
87}
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 HelpScreenPriority
constexpr data::DataId helpSequence(data::DataTag tag) noexcept
constexpr std::array< data::DataTag, 3 > HelpButtonInTags
constexpr data::DataTag HelpTitleTag
constexpr std::uint8_t HelpScreenStayAtEnd