Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
IBarCardPlayback.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 {
15 if (id == data::EmptyDataId)
16 return false;
17 const auto info = playback.runtime().info(id, CardPriority, false);
18 return info && info->sequenceClock >= info->endTime;
19 }
20
21 [[nodiscard]] std::int32_t cardY(display::Screen2D view) noexcept
22 {
24 }
25
26 [[nodiscard]] std::uint8_t endingAction(CardVisualState state) noexcept
27 {
30 }
33 std::uint8_t cardIndex) noexcept
34 {
35 const bool community = cardIndex >= CardsPerDeck;
36 const auto local = static_cast<data::DataTag>(
39 switch (state)
40 {
43 break;
46 break;
49 break;
52 break;
53 default:
54 return data::EmptyDataId;
55 }
56 return data::packDataId(
58 static_cast<data::DataTag>(base + local));
59 }
60 }
61
64 std::uint8_t cardIndex,
65 pieces::BoardCameraView camera) noexcept
66 {
67 if (cardIndex >= CardsPerDeck * 2)
68 return data::EmptyDataId;
69
71 {
72 const auto cameraIndex = static_cast<data::DataTag>(camera);
73 const auto base = cardIndex < CardsPerDeck
75 return data::packDataId(
77 static_cast<data::DataTag>(base + cameraIndex));
78 }
79
81 }
82
83
84 std::expected<void, std::string> CardPlayback::sync(
85 std::optional<std::uint8_t> desiredCard,
86 bool iBarVisible,
90 {
92 return std::unexpected("IBar card index is outside legacy 0..31 range");
93 auto nextState = visualState_;
94 auto nextLastCard = lastCard_;
95 switch (visualState_)
96 {
99 {
102 }
103 break;
105 if (!iBarVisible)
107 else if (sequenceFinished(playback, currentSequence_))
109 break;
111 if (!iBarVisible || sequenceFinished(playback, currentSequence_))
113 break;
115 if (!iBarVisible || sequenceFinished(playback, currentSequence_))
117 break;
119 if (!iBarVisible || desiredCard != lastCard_)
121 break;
124 break;
125 }
126
127 if (nextState == visualState_)
128 return {};
129
130 // Legacy case 4 forgets the outgoing ID immediately; its Stop ending
131 // action is responsible for removing the sequence later.
133 {
134 visualState_ = CardVisualState::Off;
135 currentSequence_ = data::EmptyDataId;
136 return {};
137 }
138
139 if (!nextLastCard)
140 return std::unexpected("IBar card transition has no remembered card");
141
142 const data::DataId desiredSequence = cardSequence(
143 nextState, *nextLastCard, camera);
144 if (desiredSequence == data::EmptyDataId)
145 return std::unexpected("IBar card transition resolved no sequence");
147 playback.resources(), desiredSequence);
148 if (!loaded)
149 return std::unexpected(loaded.error().detail);
150
152 options.dropFrames = true;
153 std::vector<sequence::SequenceCommand> commands;
154 if (currentSequence_ != data::EmptyDataId)
155 {
156 commands.push_back(sequence::StopSequenceCommand{
157 currentSequence_, CardPriority, false});
158 }
159 commands.push_back(sequence::StartSequenceCommand{
160 std::move(*loaded), CardPriority, options});
161 commands.push_back(sequence::makeMoveXY(
162 desiredSequence, CardPriority, CardX, cardY(view)));
164 desiredSequence, CardPriority, endingAction(nextState), false});
165
166 if (commands.size() > sequence::SequenceCommandQueue::Capacity -
167 playback.commands().pendingCount())
168 {
169 return std::unexpected(
170 "sequence command queue cannot fit IBar card transition");
171 }
172 for (auto& command : commands)
173 {
174 const auto queued = std::visit(
175 [&](auto value)
176 {
177 return playback.commands().enqueue(std::move(value));
178 },
179 std::move(command));
180 if (!queued)
181 return std::unexpected(
182 "validated IBar card command rejected");
183 }
184
185 visualState_ = nextState;
186 lastCard_ = nextLastCard;
187 currentSequence_ = desiredSequence;
188 return {};
189 }
190
191
193 {
194 visualState_ = CardVisualState::Off;
195 currentSequence_ = data::EmptyDataId;
196 lastCard_.reset();
197 }
198}
unsigned index
std::uint16_t value
Definition Timers.cpp:16
std::expected< void, std::string > sync(std::optional< std::uint8_t > desiredCard, bool iBarVisible, display::Screen2D view, pieces::BoardCameraView camera, 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
constexpr DataId EmptyDataId
Definition DataBanks.hpp:13
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 ChanceCardInBaseTag
constexpr std::uint8_t CardsPerDeck
constexpr std::int32_t CardYNotMain
constexpr data::DataTag CommunityCardOutBaseTag
constexpr data::DataTag ChanceFaceBaseTag
constexpr std::uint16_t CardPriority
constexpr data::DataTag CommunityDeckOutBaseTag
constexpr data::DataTag ChanceIdleBaseTag
constexpr std::uint8_t CardEndingStayAtEnd
constexpr data::DataTag ChanceDeckOutBaseTag
constexpr std::int32_t CardYMain
constexpr data::DataTag CommunityIdleBaseTag
constexpr data::DataTag CommunityFaceBaseTag
constexpr std::uint8_t CardEndingStop
State & state()
Definition IBar.cpp:1285
constexpr std::int32_t CardX
constexpr data::DataTag CommunityCardInBaseTag
constexpr data::DataTag ChanceCardOutBaseTag
data::DataId cardSequence(CardVisualState state, std::uint8_t cardIndex, pieces::BoardCameraView camera) noexcept
MoveSequenceCommand makeMoveXY(data::DataId dataId, std::uint16_t priority, std::int32_t x, std::int32_t y) noexcept