Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
StatsFutureImmunityPlayback.cpp
Go to the documentation of this file.
2
3#include <memory>
4#include <utility>
5#include <variant>
6#include <vector>
7
8namespace monopoly::statsui
9{
10 namespace
11 {
12 [[nodiscard]] constexpr data::DataId languageId(
13 data::DataTag tag) noexcept
14 {
15 return data::packDataId(
17 }
18
19 [[nodiscard]] constexpr data::DataId mainId(
20 data::DataTag tag) noexcept
21 {
23 }
24 }
25
27 {
28 published_.fill(std::nullopt);
29 }
30 std::expected<void, std::string> FutureImmunityPlayback::sync(
34 {
35 std::array<std::optional<Published>, SlotCount> desired{};
36 std::array<std::optional<sequence::SequenceTransform>, SlotCount>
37 transforms{};
38
40 {
41 desired[0] = Published{languageId(FutureImmunityFrameTag),
43 desired[1] = Published{languageId(FutureImmunityBoardTag),
47
48 if (state.downEnabled)
49 {
50 desired[2] = Published{mainId(FutureImmunityDownTag),
53 }
54 if (state.upEnabled)
55 {
56 desired[3] = Published{mainId(FutureImmunityUpTag),
59 }
60 }
61
62 std::array<std::shared_ptr<const sequence::SequenceProgram>, SlotCount>
63 programs{};
64 std::size_t commandCount{};
65 for (std::size_t slot = 0; slot < SlotCount; ++slot)
66 {
67 if (published_[slot] == desired[slot]) continue;
68 if (published_[slot]) ++commandCount;
69 if (!desired[slot]) continue;
70
72 playback.resources(), desired[slot]->id);
73 if (!loaded)
74 return std::unexpected(
75 "UDStats Future/Immunity sequence failed: " +
76 loaded.error().detail);
77 programs[slot] = std::move(*loaded);
79 }
81 playback.commands().pendingCount())
82 {
83 return std::unexpected(
84 "sequence command queue cannot fit UDStats Future/Immunity transition");
85 }
86
87 std::vector<sequence::SequenceCommand> commands;
88 commands.reserve(commandCount);
89 for (std::size_t slot = 0; slot < SlotCount; ++slot)
90 {
91 if (published_[slot] == desired[slot]) continue;
92 if (published_[slot])
93 {
94 commands.push_back(sequence::StopSequenceCommand{
95 published_[slot]->id,
96 published_[slot]->priority,
97 false});
98 }
99 if (desired[slot])
100 {
101 commands.push_back(sequence::StartSequenceCommand{
103 }
104 }
105 for (auto& command : commands)
106 {
107 const auto queued = std::visit(
108 [&](auto value)
109 {
110 return playback.commands().enqueue(std::move(value));
111 }, std::move(command));
112 if (!queued)
113 return std::unexpected(
114 "validated UDStats Future/Immunity command rejected");
115 }
116
117 published_ = desired;
118 return {};
119 }
120}
PlayerNumber slot
unsigned state
unsigned index
std::uint16_t value
Definition Timers.cpp:16
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::expected< void, std::string > sync(const FutureImmunityState &state, display::Screen2D desiredView, engine::SequencePlayback &playback)
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
SequenceTransform moveXYTransform(std::int32_t x, std::int32_t y) noexcept
constexpr data::DataTag FutureImmunityDownTag
constexpr Rect FutureImmunityPopupRect
constexpr std::uint16_t FutureImmunityArrowPriority
constexpr std::uint16_t FutureImmunityContentPriority
constexpr data::DataTag FutureImmunityBoardTag
constexpr data::DataTag FutureImmunityFrameTag
constexpr data::DataTag FutureImmunityUpTag
constexpr std::uint16_t FutureImmunityPopupPriority