Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
StatsDeedBarPlayback.cpp
Go to the documentation of this file.
2
3#include <map>
4#include <memory>
5#include <set>
6#include <utility>
7
8namespace monopoly::statsui
9{
10 namespace
11 {
12 using Objects = std::vector<DeedBarPlayback::Published>;
13
14 [[nodiscard]] constexpr data::DataId mainId(data::DataTag tag) noexcept
15 {
17 }
18
19 [[nodiscard]] std::expected<Objects, std::string> desiredObjects(
20 const State& state, const rules::GameState& gameState,
21 const PlayerPlaybackInputs& inputs)
22 {
23 Objects result;
25 if (!grid) return std::unexpected(grid.error());
26 for (const auto& item : *grid)
27 {
28 if (state.activeSort != 1)
29 {
30 // UDStats sort-by-price/rent/earnings draws TAB_dvaldisp
31 // under the runtime 52x13 value text at this same origin.
32 result.push_back({mainId(0x00D0), DeedOwnerBarPriority,
33 item.x + DeedOwnerBarOffsetX, item.y + DeedOwnerBarOffsetY});
34 continue;
35 }
36 const auto owner = gameState.squares[
37 static_cast<std::size_t>(item.square)].owner;
38 if (owner >= gameState.numberOfPlayers ||
39 owner >= rules::MaxPlayers)
40 {
41 continue;
42 }
43 const auto colour = gameState.players[owner].colour;
45 return std::unexpected("UDStats Deed owner colour is out of range");
46
47 result.push_back({mainId(static_cast<data::DataTag>(
50 item.x + DeedOwnerBarOffsetX,
51 item.y + DeedOwnerBarOffsetY});
52 }
53 return result;
54 }
55 }
56 std::expected<void, std::string> DeedBarPlayback::sync(
61 {
64 state.screen == Screen::Deed)
65 {
67 if (!planned) return std::unexpected(planned.error());
68 desired = std::move(*planned);
69 }
70
71 if (desired == current_) return {};
72
73 std::map<data::DataId,
74 std::shared_ptr<const sequence::SequenceProgram>> programs;
75 for (const auto& object : desired)
76 {
77 if (programs.contains(object.id)) continue;
79 playback.resources(), object.id);
80 if (!loaded)
81 return std::unexpected(
82 "UDStats Deed owner bar resource failed: " + loaded.error().detail);
83 programs.emplace(object.id, std::move(*loaded));
84 }
85
86 std::set<std::pair<data::DataId, std::uint16_t>> stops;
87 for (const auto& object : current_)
88 stops.emplace(object.id, object.priority);
89
90 const std::size_t required = stops.size() + desired.size();
92 playback.commands().pendingCount())
93 {
94 return std::unexpected(
95 "sequence command queue cannot fit UDStats Deed owner bars");
96 }
97 for (const auto& [id, priority] : stops)
98 {
99 if (!playback.commands().enqueue(
101 return std::unexpected("validated UDStats Deed owner-bar stop rejected");
102 }
103
104 for (const auto& object : desired)
105 {
106 if (!playback.commands().enqueue(sequence::StartSequenceCommand{
107 programs.at(object.id), object.priority, {},
108 sequence::moveXYTransform(object.x, object.y)}))
109 return std::unexpected("validated UDStats Deed owner-bar start rejected");
110 }
111
112 current_ = std::move(desired);
113 return {};
114 }
115}
data::DataId id
std::uint16_t priority
unsigned state
unsigned index
int colour
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, const rules::GameState &gameState, const PlayerPlaybackInputs &inputs, display::Screen2D desiredView, engine::SequencePlayback &playback)
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
constexpr std::size_t MaxPlayerColours
Definition RuleTypes.hpp:33
constexpr PlayerNumber MaxPlayers
Definition RuleTypes.hpp:14
SequenceTransform moveXYTransform(std::int32_t x, std::int32_t y) noexcept
constexpr int DeedOwnerBarOffsetX
constexpr std::uint16_t DeedOwnerBarPriority
constexpr int DeedOwnerBarOffsetY
std::expected< std::vector< DeedPlayback::Published >, std::string > planDeedGrid(const State &state, const rules::GameState &gameState, const PlayerPlaybackInputs &inputs)
constexpr data::DataTag DeedOwnerBarBaseTag