Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
MousePointerPlayback.cpp
Go to the documentation of this file.
2
3namespace monopoly::mouse
4{
6 {
7 visible_ = false;
8 x_ = y_ = 0;
9 authoredTransform_ = sequence::identity2D();
10 }
11 std::expected<void, std::string> Playback::sync(
13 {
14 const bool desired = assetVisible(state);
15 if (desired == visible_ && (!desired || (x_ == state.x && y_ == state.y)))
16 return {};
17 if (playback.commands().pendingCount() == sequence::SequenceCommandQueue::Capacity)
18 return std::unexpected("sequence command queue cannot fit mouse pointer update");
19 if (!desired)
20 {
21 const auto stopped = playback.stop(PointerDataId, PointerPriority);
22 if (!stopped) return stopped;
23 visible_ = false;
24 return {};
25 }
26 if (!visible_)
27 {
28 const auto program = sequence::SequenceProgram::load(playback.resources(), PointerDataId);
29 if (!program) return std::unexpected("mouse pointer resource failed: " + program.error().detail);
30 const auto& root = (*program)->descriptions().front();
31 const auto initial = sequence::initialSequenceTransform(root.record, root.attributes, 2);
32 const auto* authored = std::get_if<sequence::Matrix2D>(&initial.local);
33 const auto base = authored ? *authored : sequence::identity2D();
34 // L_Seqncr.cpp:12224 uses positive hotspot offsets; the active
35 // DISPLAY/UDChat caller passes (0,0). Keep authored asset transforms.
36 const auto positioned = sequence::multiply(base, sequence::translate2D(state.x, state.y));
38 options.endingAction = 3; // AddMouseSubSequenceTheWorks: LoopToBeginning.
39 const auto started = playback.commands().enqueue(sequence::StartSequenceCommand{
40 *program, PointerPriority, options, positioned});
41 if (!started) return std::unexpected("mouse pointer start rejected");
42 authoredTransform_ = base;
43 visible_ = true;
44 }
45 else
46 {
47 const auto moved = playback.move(PointerDataId, PointerPriority,
48 sequence::multiply(authoredTransform_, sequence::translate2D(state.x, state.y)));
49 if (!moved) return moved;
50 }
51 x_ = state.x;
52 y_ = state.y;
53 return {};
54 }
55}
std::size_t root
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={})
bool assetVisible(const State &state) noexcept
constexpr data::DataId PointerDataId
constexpr std::uint16_t PointerPriority
Matrix2D identity2D() noexcept
Matrix2D translate2D(std::int32_t x, std::int32_t y) noexcept
InitialSequenceTransform initialSequenceTransform(const data::LegacySequenceRecord &record, const data::LegacySequenceAttributes &attributes, std::uint8_t parentDimensionality) noexcept
Matrix2D multiply(const Matrix2D &left, const Matrix2D &right) noexcept