Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
PieceIdlePlayback.cpp
Go to the documentation of this file.
2
3namespace monopoly::pieces
4{
5 std::expected<void, std::string> PieceIdlePlayback::begin(
7 {
8 if (plan_) return std::unexpected("piece idle playback already active");
9 if (!plan.movingOut && !plan.movingIn)
10 return std::unexpected("piece idle transition has no animations");
11 plan_ = std::move(plan);
12 movingOutSequence_ = data::EmptyDataId;
13 movingInSequence_ = data::EmptyDataId;
14 started_ = false;
15 return {};
16 }
17
18 std::expected<void, std::string> PieceIdlePlayback::startAnimation(
21 {
22 if (animation.sequence == data::EmptyDataId)
23 return std::unexpected("piece idle animation has an empty DataID");
24 const auto started = playback.transitionRySTxzDropStayAtEnd(
25 std::nullopt, animation.sequence, TokenPriority,
26 animation.startPose.yaw, 1.0F,
27 animation.startPose.x, animation.startPose.z);
28 if (!started) return std::unexpected(started.error());
29 current = animation.sequence;
30 return {};
31 }
32
33 bool PieceIdlePlayback::finished(data::DataId id,
34 engine::SequencePlayback& playback) const noexcept
35 {
36 if (id == data::EmptyDataId) return true;
37 const auto info = playback.runtime().info(id, TokenPriority, false);
38 return !info || info->endTime <= info->sequenceClock;
39 }
40
41 std::expected<PieceIdlePlaybackUpdate, std::string> PieceIdlePlayback::tick(
43 {
45 if (!plan_) return update;
46
47 if (!started_)
48 {
49 if (plan_->movingOut)
50 {
51 const auto out = startAnimation(
52 *plan_->movingOut, playback, movingOutSequence_);
53 if (!out) return std::unexpected(out.error());
54 }
55 if (plan_->movingIn)
56 {
57 const auto in = startAnimation(
58 *plan_->movingIn, playback, movingInSequence_);
59 if (!in)
60 {
61 if (movingOutSequence_ != data::EmptyDataId)
62 (void)playback.stop(movingOutSequence_, TokenPriority);
63 movingOutSequence_ = data::EmptyDataId;
64 plan_.reset();
65 return std::unexpected(in.error());
66 }
67 }
68 started_ = true;
69 update.active = true;
70 return update;
71 }
72
73 if (finished(movingOutSequence_, playback) &&
74 movingOutSequence_ != data::EmptyDataId)
75 {
76 const auto stopped = playback.stop(movingOutSequence_, TokenPriority);
77 if (!stopped) return std::unexpected(stopped.error());
78 movingOutSequence_ = data::EmptyDataId;
79 }
80
81 if (finished(movingInSequence_, playback) &&
82 movingInSequence_ != data::EmptyDataId)
83 {
84 const auto stopped = playback.stop(movingInSequence_, TokenPriority);
85 if (!stopped) return std::unexpected(stopped.error());
86 movingInSequence_ = data::EmptyDataId;
87 }
88
89 if (movingOutSequence_ == data::EmptyDataId &&
90 movingInSequence_ == data::EmptyDataId)
91 {
92 plan_.reset();
93 started_ = false;
94 update.completed = true;
95 return update;
96 }
97
98 update.active = true;
99 return update;
100 }
101}
decision::EconomicActionPlan plan
unsigned index
std::atomic< bool > finished
data::DataId out
std::expected< void, std::string > begin(PieceIdleTransitionPlan plan)
std::expected< PieceIdlePlaybackUpdate, std::string > tick(engine::SequencePlayback &playback)
std::uint32_t DataId
Definition DataBanks.hpp:10
constexpr DataId EmptyDataId
Definition DataBanks.hpp:13
constexpr std::uint16_t TokenPriority