Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
TradeActionButtonPlayback.cpp
Go to the documentation of this file.
2
3#include <array>
4#include <memory>
5#include <utility>
6#include <variant>
7#include <vector>
8
10{
11 namespace
12 {
13 struct ButtonSpec
14 {
17 std::uint16_t priority{};
18 };
19
20 [[nodiscard]] constexpr std::array<ButtonSpec, 2>
22 {
23 return {{
30 }
31 }
32
33 std::expected<void, std::string> ActionButtonPlayback::sync(
34 const State& state,
37 {
38 const bool desiredVisible =
40 if (desiredVisible == visible_)
41 return {};
42
43 const auto specs = buttonSpecs();
44 std::array<std::shared_ptr<const sequence::SequenceProgram>, 2> programs{};
45 for (std::size_t index = 0; index < specs.size(); ++index)
46 {
47 const auto id = desiredVisible ? specs[index].idle : specs[index].out;
48 auto loaded = sequence::SequenceProgram::load(playback.resources(), id);
49 if (!loaded)
50 return std::unexpected(loaded.error().detail);
51 programs[index] = std::move(*loaded);
52 }
53
54 std::vector<sequence::SequenceCommand> commands;
55 commands.reserve(desiredVisible ? 4U : 8U);
56
57 for (std::size_t index = 0; index < specs.size(); ++index)
58 {
59 const auto& spec = specs[index];
61 {
62 commands.push_back(sequence::StartSequenceCommand{
63 programs[index], spec.priority, {}});
64 commands.push_back(sequence::makeMoveXY(
65 spec.idle, spec.priority, 0, 0));
66 }
67 else
68 {
69 commands.push_back(sequence::StopSequenceCommand{
70 spec.idle, spec.priority, false});
71 commands.push_back(sequence::StartSequenceCommand{
72 programs[index], spec.priority, {}});
73 commands.push_back(sequence::makeMoveXY(
74 spec.out, spec.priority, 0, 0));
76 spec.out, spec.priority, TradeActionEndingStop, false});
77 }
78 }
79
80 if (commands.size() > sequence::SequenceCommandQueue::Capacity -
81 playback.commands().pendingCount())
82 {
83 return std::unexpected(
84 "sequence command queue cannot fit Trade action-button transition");
85 }
86
87 for (auto& command : commands)
88 {
89 const auto queued = std::visit(
90 [&](auto value)
91 {
92 return playback.commands().enqueue(std::move(value));
93 },
94 std::move(command));
95 if (!queued)
96 return std::unexpected(
97 "validated Trade action-button command rejected");
98 }
99
100 visible_ = desiredVisible;
101 return {};
102 }
103}
std::uint16_t priority
unsigned state
unsigned index
std::uint16_t value
Definition Timers.cpp:16
data::DataId idle
data::DataId out
static std::expected< std::shared_ptr< const SequenceProgram >, RuntimeError > load(const data::DataSource &source, data::DataId id, std::size_t offset=0, DescriptionLimits limits={})
std::expected< void, std::string > sync(const State &state, display::Screen2D desiredView, engine::SequencePlayback &playback)
std::uint32_t DataId
Definition DataBanks.hpp:10
MoveSequenceCommand makeMoveXY(data::DataId dataId, std::uint16_t priority, std::int32_t x, std::int32_t y) noexcept
constexpr std::uint16_t TradeProposePriority
constexpr data::DataId tradeActionSequence(data::DataTag tag) noexcept
constexpr data::DataTag TradeCancelOutTag
constexpr data::DataTag TradeProposeOutTag
constexpr data::DataTag TradeCancelIdleTag
constexpr std::uint8_t TradeActionEndingStop
constexpr std::uint16_t TradeCancelPriority
constexpr data::DataTag TradeProposeIdleTag