10 constexpr std::uint8_t LoopToBeginning = 3;
14 const std::array<std::uint8_t, 2>& values)
noexcept
17 const auto offset =
static_cast<std::uint32_t
>(values[0] - 1U) * 12U +
18 static_cast<std::uint32_t
>(values[1] - 1U) * 2U;
30 bool validValues(
const std::array<std::uint8_t, 2>& values)
noexcept
32 return values[0] >= 1 && values[0] <= 6 &&
33 values[1] >= 1 && values[1] <= 6;
37 const std::array<std::uint8_t, 2>& values)
noexcept
43 const std::array<std::uint8_t, 2>& values)
noexcept
74 static_cast<std::int32_t
>(
index * 24) - 35, 0,
85 std::vector<sequence::SequenceCommand> commands;
86 auto fixed = currentDiceID_;
87 auto bob = currentBobDice_;
89 const auto start = [&](
const TwoDItem& item) -> std::expected<void, std::string> {
91 if (!program)
return std::unexpected(program.error().detail);
97 item.sequence,item.
priority,LoopToBeginning,
false});
128 for (
const auto& item:
plan.dice)
130 const auto ready=start(*item);
137 return std::unexpected(
"sequence command queue cannot fit dice 2D transition");
138 for (
auto& command:commands)
140 const auto queued=std::visit([&](
auto value) {
142 },std::move(command));
143 if (!queued)
return std::unexpected(
"validated dice 2D command rejected");
145 currentDiceID_=
fixed;
154 return std::unexpected(
"dice roll playback already active");
157 rollStarted_ =
false;
158 cameraReleased_ =
false;
168 rollStarted_ =
false;
169 cameraReleased_ =
false;
172 std::expected<bool, std::string> Playback::syncIdle(
179 if (
desired == current3D_)
return false;
186 if (!stopped)
return std::unexpected(stopped.error());
193 const std::optional<data::DataId>
previous =
195 std::optional<data::DataId>(current3D_);
215 if (!
idle)
return std::unexpected(
idle.error());
216 update.idleChanged = *
idle;
220 update.activeRoll =
true;
222 tick - request_->lockTick : 0
U;
227 if (cameraSetTime_ != request_->lockTick)
229 cameraSetTime_ = request_->lockTick;
230 update.cameraTakeover =
true;
232 if (current3D_ !=
rollId &&
237 if (!stopped)
return std::unexpected(stopped.error());
247 const auto started =
playback.transitionMovedDrop(
250 if (!started)
return std::unexpected(started.error());
254 update.startedRoll =
true;
257 if (
elapsed > 90U && !cameraReleased_)
259 cameraReleased_ =
true;
260 update.cameraRelease =
true;
261 update.announceRoll =
true;
268 rollStarted_ =
false;
269 cameraReleased_ =
false;
270 update.activeRoll =
false;
271 update.queueRelease =
true;
274 if (!
idle)
return std::unexpected(
idle.error());
275 update.idleChanged = *
idle;
decision::EconomicActionPlan plan
std::vector< std::uint8_t > data
std::expected< PlaybackUpdate, std::string > tick(std::uint64_t tick, bool boardVisible, bool iBarVisible, const rules::GameState &state, engine::SequencePlayback &playback)
std::expected< void, std::string > begin(RollRequest request)
std::expected< void, std::string > sync(const std::array< std::uint8_t, 2 > &values, bool rollAnimationDesired, bool iBarVisible, bool &diceRollNotification, engine::SequencePlayback &playback)
static constexpr std::size_t Capacity
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 DataId EmptyDataId
constexpr DataId packDataId(std::uint16_t group, DataTag tag) noexcept
data::DataId idle3DSequence(const std::array< std::uint8_t, 2 > &values) noexcept
constexpr data::DataTag Idle3DBaseTag
constexpr data::DataTag Roll3DBaseTag
data::DataId roll3DSequence(const std::array< std::uint8_t, 2 > &values) noexcept
constexpr std::uint16_t IBarGeneralPriority
bool validValues(const std::array< std::uint8_t, 2 > &values) noexcept
constexpr data::DataTag Bobbing2DTag
constexpr data::DataTag Fixed2DBaseTag
constexpr std::uint16_t Generic3DPriority
TwoDPlan plan2D(const std::array< std::uint8_t, 2 > &values, bool rollAnimationDesired, bool iBarVisible) noexcept
Matrix3D moveRySTxzTransform(float yaw, float scale, float x, float z) noexcept
std::variant< std::monostate, Matrix2D, Matrix3D > SequenceTransform
MoveSequenceCommand makeMoveXY(data::DataId dataId, std::uint16_t priority, std::int32_t x, std::int32_t y) noexcept
std::optional< bool > dropFrames