Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
ChatOptionPlayback.cpp
Go to the documentation of this file.
2
3#include <algorithm>
4#include <map>
5#include <memory>
6#include <utility>
7
8namespace monopoly::chat
9{
10 namespace
11 {
12 [[nodiscard]] constexpr data::DataId mainId(data::DataTag tag) noexcept
13 {
15 }
16
17 [[nodiscard]] std::vector<OptionPlayback::Published> desiredObjects(
18 const State& state)
19 {
20 std::vector<OptionPlayback::Published> result;
21 if (!state.boxActive) return result;
22
23 result.push_back({mainId(ChatOptionButtonTag),
25 state.windowX + state.windowWidth - 58, state.windowY + 2});
26 if (state.optionsOpen)
27 result.push_back({mainId(ChatOptionPanelTag),
29 state.windowX + state.windowWidth - 120, state.windowY + 16});
30 return result;
31 }
32 }
33 std::expected<void, std::string> OptionPlayback::sync(
34 const State& state,
36 {
38 if (desired == current_) return {};
39
40 std::vector<Published> removed;
41 std::vector<Published> added;
42 for (const auto& object : current_)
43 if (std::find(desired.begin(), desired.end(), object) == desired.end())
44 removed.push_back(object);
45 for (const auto& object : desired)
46 if (std::find(current_.begin(), current_.end(), object) == current_.end())
47 added.push_back(object);
48
49 std::map<data::DataId,
50 std::shared_ptr<const sequence::SequenceProgram>> programs;
51 for (const auto& object : added)
52 {
53 if (programs.contains(object.id)) continue;
55 playback.resources(), object.id);
56 if (!loaded)
57 return std::unexpected(
58 "UDChat option resource failed: " + loaded.error().detail);
59 programs.emplace(object.id, std::move(*loaded));
60 }
61
62 const std::size_t required = removed.size() + added.size();
64 playback.commands().pendingCount())
65 {
66 return std::unexpected(
67 "sequence command queue cannot fit UDChat option transition");
68 }
69
70 for (const auto& object : removed)
71 {
72 if (!playback.commands().enqueue(
74 object.id, object.priority, false}))
75 return std::unexpected(
76 "validated UDChat option stop rejected");
77 }
78 for (const auto& object : added)
79 {
80 if (!playback.commands().enqueue(sequence::StartSequenceCommand{
81 programs.at(object.id), object.priority, {},
82 sequence::moveXYTransform(object.x, object.y)}))
83 return std::unexpected(
84 "validated UDChat option start rejected");
85 }
86
87 current_ = std::move(desired);
88 return {};
89 }
90}
std::uint16_t priority
unsigned state
unsigned index
std::expected< void, std::string > sync(const State &state, 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={})
constexpr std::uint16_t ChatOptionPanelPriority
constexpr std::uint16_t ChatOptionButtonPriority
constexpr data::DataTag ChatOptionPanelTag
constexpr data::DataTag ChatOptionButtonTag
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