Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
IBarCameraButtonPlayback.cpp
Go to the documentation of this file.
2
3#include <utility>
4#include <variant>
5#include <vector>
6
7namespace monopoly::ibar
8{
9 namespace
10 {
12 engine::SequencePlayback& playback,
13 data::DataId id,
14 std::uint16_t priority)
15 {
16 if (id == data::EmptyDataId)
17 return false;
18 const auto info = playback.runtime().info(
19 id, priority, false);
20 return info && info->sequenceClock >= info->endTime;
21 }
22
23 [[nodiscard]] std::uint8_t endingAction(
25 {
26 // UDIBar.cpp:1080-1089 contains a historical always-true
27 // idle condition because the two final enum constants are used
28 // as booleans. Preserve the resulting behavior: every Idle loops.
31 }
32 }
33
34 std::expected<void, std::string> CameraButtonPlayback::sync(
35 bool desired,
37 bool useGreyButtons,
38 bool buttonBarStable,
39 bool allowIncoming,
40 bool requestPressed)
41 {
42 auto nextState = visualState_;
43 switch (visualState_)
44 {
48 break;
50 if (sequenceFinished(playback, currentSequence_, priority_))
52 break;
55 {
57 }
58 else if (currentGrey_ != useGreyButtons ||
60 {
61 // Source UDIBar.cpp lets a local/remote style reset leave Idle
62 // even while another button is flying, but ordinary removal
63 // waits for the globally stable button bar.
65 }
66 break;
69 if (sequenceFinished(playback, currentSequence_, priority_))
71 break;
72 }
73
74 if (nextState == visualState_)
75 return {};
76
77 const auto desiredSequence = actionButtonSequence(
78 buttonIndex_, nextState, useGreyButtons);
79 std::shared_ptr<const sequence::SequenceProgram> program;
80 if (desiredSequence != data::EmptyDataId)
81 {
83 playback.resources(), desiredSequence);
84 if (!loaded)
85 return std::unexpected(loaded.error().detail);
86 program = std::move(*loaded);
87 }
88
89 std::vector<sequence::SequenceCommand> commands;
90 if (currentSequence_ != data::EmptyDataId)
91 {
92 commands.push_back(sequence::StopSequenceCommand{
93 currentSequence_, priority_, false});
94 }
95
96 if (desiredSequence != data::EmptyDataId)
97 {
99 options.dropFrames = true;
100 commands.push_back(sequence::StartSequenceCommand{
101 std::move(program), priority_, options});
102 commands.push_back(sequence::makeMoveXY(
103 desiredSequence, priority_, 0, 0));
105 desiredSequence, priority_, endingAction(nextState), false});
106 }
107
108 if (commands.size() >
110 playback.commands().pendingCount())
111 {
112 return std::unexpected(
113 "sequence command queue cannot fit IBar action-button transition");
114 }
115
116 for (auto& command : commands)
117 {
118 const auto queued = std::visit(
119 [&](auto value)
120 {
121 return playback.commands().enqueue(std::move(value));
122 },
123 std::move(command));
124 if (!queued)
125 {
126 return std::unexpected(
127 "validated IBar action-button command rejected");
128 }
129 }
130
131 visualState_ = nextState;
132 currentSequence_ = desiredSequence;
133 currentGrey_ = useGreyButtons;
134 return {};
135 }
136}
std::uint16_t priority
unsigned index
std::uint16_t value
Definition Timers.cpp:16
std::expected< void, std::string > sync(bool desired, engine::SequencePlayback &playback, bool useGreyButtons=false, bool buttonBarStable=true, bool allowIncoming=true, bool requestPressed=false)
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
constexpr DataId EmptyDataId
Definition DataBanks.hpp:13
constexpr data::DataId actionButtonSequence(std::uint8_t buttonIndex, CameraButtonVisualState state, bool useGreyButtons=false) noexcept
constexpr std::uint8_t CameraButtonLoopToBeginning
State & state()
Definition IBar.cpp:1285
constexpr std::uint8_t CameraButtonStayAtEnd
MoveSequenceCommand makeMoveXY(data::DataId dataId, std::uint16_t priority, std::int32_t x, std::int32_t y) noexcept