Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
ChatFluffPlayback.cpp
Go to the documentation of this file.
2
3#include <algorithm>
4#include <memory>
5#include <utility>
6
8{
9 namespace
10 {
11 [[nodiscard]] constexpr data::DataId mainId(data::DataTag tag) noexcept
12 {
14 }
15
16 [[nodiscard]] std::vector<FluffPlayback::Published> desiredObjects(
18 {
19 std::vector<FluffPlayback::Published> result;
20 if (state.boxActive)
21 {
22 result.push_back({mainId(ChatFluffButtonTag),
24 state.windowX + state.windowWidth - 40, state.windowY + 2});
25 }
26 if (!state.boxActive || !state.fluffOpen) return result;
27
29 state.fluffWindowX, state.fluffWindowY});
31 state.fluffWindowX + state.fluffWindowWidth - 22,
32 state.fluffWindowY});
33 for (std::size_t category = 0; category < ChatFluffCategoryTags.size(); ++category)
34 {
35 result.push_back({mainId(ChatFluffCategoryTags[category]),
37 state.fluffWindowX + state.fluffWindowWidth - 143 +
38 static_cast<int>(category) * 20,
39 state.fluffWindowY + 2});
40 }
41 // TextPlayback already composites these arrows into the alpha
42 // background. Separate opaque sequences would cover that alpha.
43 if (!state.fluffShaded && !bodyControlsInBackground)
44 {
46 state.fluffWindowX + state.fluffWindowWidth - 18,
47 state.fluffWindowY + 18});
49 state.fluffWindowX + state.fluffWindowWidth - 18,
50 state.fluffWindowY + state.fluffWindowHeight - 35});
51 }
52 return result;
53 }
54 }
55
56 std::expected<void, std::string> FluffPlayback::sync(
57 const State& state,
60 {
62 if (desired == current_) return {};
63
64 std::vector<Published> removed;
65 std::vector<Published> added;
66 for (const auto& object : current_)
67 if (std::find(desired.begin(), desired.end(), object) == desired.end())
68 removed.push_back(object);
69 for (const auto& object : desired)
70 if (std::find(current_.begin(), current_.end(), object) == current_.end())
71 added.push_back(object);
72
73 std::vector<std::shared_ptr<const sequence::SequenceProgram>> programs;
74 programs.reserve(added.size());
75 for (const auto& object : added)
76 {
78 playback.resources(), object.id);
79 if (!loaded)
80 return std::unexpected(
81 "UDChat fluff resource failed: " + loaded.error().detail);
82 programs.push_back(std::move(*loaded));
83 }
84
85 const std::size_t required = removed.size() + added.size();
87 playback.commands().pendingCount())
88 return std::unexpected(
89 "sequence command queue cannot fit UDChat fluff transition");
90
91 for (const auto& object : removed)
92 if (!playback.commands().enqueue(sequence::StopSequenceCommand{
93 object.id, object.priority, false}))
94 return std::unexpected("validated UDChat fluff stop rejected");
95
96 for (std::size_t index = 0; index < added.size(); ++index)
97 {
98 const auto& object = added[index];
99 if (!playback.commands().enqueue(sequence::StartSequenceCommand{
100 programs[index], object.priority, {},
101 sequence::moveXYTransform(object.x, object.y)}))
102 return std::unexpected("validated UDChat fluff start rejected");
103 }
104
105 current_ = std::move(desired);
106 return {};
107 }
108}
unsigned state
unsigned index
std::expected< void, std::string > sync(const State &state, engine::SequencePlayback &playback, bool bodyControlsInBackground=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={})
constexpr data::DataTag ChatFluffCloseTag
constexpr data::DataTag ChatFluffButtonTag
constexpr data::DataTag ChatFluffDownTag
constexpr std::uint16_t ChatFluffWindowPriority
constexpr std::uint16_t ChatFluffButtonPriority
constexpr data::DataTag ChatFluffUpTag
constexpr std::array< data::DataTag, 6 > ChatFluffCategoryTags
constexpr data::DataTag ChatFluffShadeTag
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