Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
EscapeConfirmationPlayback.cpp
Go to the documentation of this file.
2
3#include <array>
4#include <memory>
5#include <utility>
6
8{
9 namespace
10 {
11 struct Item
12 {
14 std::uint16_t priority{};
15 int x{};
16 int y{};
17 };
18
20 data::DataTag tag) noexcept
21 {
23 }
24
25 [[nodiscard]] constexpr std::array<Item, 3> items(bool usa) noexcept
26 {
29 const auto no = usa ? EscapeNoUsaTag : EscapeNoEuropeTag;
30 return {{
32 {languageGraphic(yes), static_cast<std::uint16_t>(EscapeMenuPriority + 1), 299, 183},
33 {languageGraphic(no), static_cast<std::uint16_t>(EscapeMenuPriority + 1), 419, 183}
34 }};
35 }
36 }
37
38 std::expected<void, std::string> EscapeConfirmationPlayback::sync(
39 const State& state, bool usaEdition,
41 {
43 if (desiredVisible == visible_ &&
44 (!desiredVisible || usaEdition == usaEdition_))
45 {
46 return {};
47 }
48
49 const auto previous = items(usaEdition_);
50 const auto desired = items(usaEdition);
51
52 std::array<std::shared_ptr<const sequence::SequenceProgram>, 3> programs{};
54 {
55 for (std::size_t index = 0; index < desired.size(); ++index)
56 {
58 playback.resources(), desired[index].id);
59 if (!loaded)
60 return std::unexpected(
61 "Escape confirmation resource failed: " + loaded.error().detail);
62 programs[index] = std::move(*loaded);
63 }
64 }
65
66 const bool replaceVisible = visible_ &&
67 (!desiredVisible || usaEdition != usaEdition_);
68 const std::size_t stopCount = replaceVisible ? previous.size() : 0U;
69 const std::size_t startCount = desiredVisible ? desired.size() : 0U;
71 playback.commands().pendingCount())
72 {
73 return std::unexpected(
74 "sequence command queue cannot fit Escape confirmation transition");
75 }
76
78 {
79 for (const auto& item : previous)
80 {
81 if (!playback.commands().enqueue(sequence::StopSequenceCommand{
82 item.id, item.priority, false}))
83 return std::unexpected(
84 "validated Escape confirmation stop rejected");
85 }
86 }
87
89 {
90 for (std::size_t index = 0; index < desired.size(); ++index)
91 {
92 const auto& item = desired[index];
93 if (!playback.commands().enqueue(sequence::StartSequenceCommand{
94 programs[index], item.priority, {},
95 sequence::moveXYTransform(item.x, item.y)}))
96 return std::unexpected(
97 "validated Escape confirmation start rejected");
98 }
99 }
100
101 visible_ = desiredVisible;
102 usaEdition_ = usaEdition;
103 return {};
104 }
105}
std::uint16_t priority
unsigned index
std::expected< void, std::string > sync(const State &state, bool usaEdition, 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
std::uint16_t DataTag
Definition DataBanks.hpp:11
constexpr DataId packDataId(std::uint16_t group, DataTag tag) noexcept
Definition DataBanks.hpp:39
constexpr data::DataTag EscapeYesEuropeTag
constexpr data::DataTag EscapeYesUsaTag
constexpr data::DataTag EscapeAskEuropeTag
constexpr data::DataTag EscapeNoUsaTag
constexpr std::uint16_t EscapeMenuPriority
State & state()
Definition IBar.cpp:1285
constexpr data::DataTag EscapeNoEuropeTag
constexpr data::DataTag EscapeAskUsaTag
SequenceTransform moveXYTransform(std::int32_t x, std::int32_t y) noexcept