Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
StatsDeedFloaterPlayback.cpp
Go to the documentation of this file.
2
3#include "IBarLayout.hpp"
4
5#include <algorithm>
6#include <memory>
7#include <vector>
8
9namespace monopoly::statsui
10{
11 namespace
12 {
13 [[nodiscard]] constexpr data::DataId mainId(data::DataTag tag) noexcept
14 {
16 }
17
18 [[nodiscard]] constexpr data::DataId languageId(data::DataTag tag) noexcept
19 {
21 }
22
23 [[nodiscard]] bool contains(const DeedPlayback::Published& item,
24 int x, int y) noexcept
25 {
26 return x >= item.x && x < item.x + DeedCardHitWidth &&
27 y >= item.y && y < item.y + DeedCardHitHeight;
28 }
29 [[nodiscard]] data::DataId floaterDeedId(int square, int city) noexcept
30 {
31 const int property = ibar::layout::propertyIndex(square);
32 if (property < 0) return data::EmptyDataId;
33 const int safeCity = std::max(city, 0);
34 return languageId(static_cast<data::DataTag>(
35 DeedFloaterCardBaseTag + property +
37 }
38 }
39
40 std::expected<void, std::string> DeedFloaterPlayback::sync(
42 const PlayerPlaybackInputs& inputs, int city,
45 {
47 int desiredFrameX = 0;
48 int desiredDeedX = 0;
49 // UDStats.cpp: normal hover is disabled while IsPopUpIDOn.
51 state.screen == Screen::Deed && state.mouseKnown)
52 {
54 if (!grid) return std::unexpected(grid.error());
55 for (const auto& item : *grid)
56 {
57 if (!contains(item, state.mouseX, state.mouseY)) continue;
58 desiredDeed = playback.deedDataId(item.square, true,
59 floaterDeedId(item.square, city));
61 return std::unexpected("UDStats Deed floater square has no large deed");
62 const bool showLeft = state.mouseX > 400;
63 desiredFrameX = showLeft ? 10 : 410;
64 desiredDeedX = showLeft ? 203 : 603;
65 break;
66 }
67 }
68
69 if (desiredDeed == currentDeed_ &&
70 desiredFrameX == currentFrameX_ && desiredDeedX == currentDeedX_)
71 return {};
73 std::shared_ptr<const sequence::SequenceProgram> frameProgram;
74 std::shared_ptr<const sequence::SequenceProgram> deedProgram;
76 {
78 playback.resources(), frameId);
79 if (!frame)
80 return std::unexpected("UDStats Deed floater frame failed: " +
81 frame.error().detail);
82 frameProgram = std::move(*frame);
83
84 auto deed = playback.loadProgram(desiredDeed);
85 if (!deed)
86 return std::unexpected("UDStats Deed floater deed failed: " +
87 deed.error());
88 deedProgram = std::move(*deed);
89 }
90 std::vector<sequence::SequenceCommand> commands;
91 if (currentDeed_ != data::EmptyDataId)
92 {
93 commands.push_back(sequence::StopSequenceCommand{
95 commands.push_back(sequence::StopSequenceCommand{
96 currentDeed_, DeedFloaterCardPriority, false});
97 }
98
100 {
101 commands.push_back(sequence::StartSequenceCommand{
102 std::move(frameProgram), DeedFloaterPriority, {},
104 commands.push_back(sequence::StartSequenceCommand{
105 std::move(deedProgram), DeedFloaterCardPriority, {},
107 }
108 if (commands.size() > sequence::SequenceCommandQueue::Capacity -
109 playback.commands().pendingCount())
110 {
111 return std::unexpected(
112 "sequence command queue cannot fit UDStats Deed floater transition");
113 }
114 for (auto& command : commands)
115 {
116 const auto queued = std::visit(
117 [&](auto value)
118 {
119 return playback.commands().enqueue(std::move(value));
120 }, std::move(command));
121 if (!queued)
122 return std::unexpected("validated UDStats Deed floater command rejected");
123 }
124
125 currentDeed_ = desiredDeed;
126 currentFrameX_ = desiredFrameX;
127 currentDeedX_ = desiredDeedX;
128 return {};
129 }
130}
unsigned state
unsigned index
std::size_t frame
std::uint16_t value
Definition Timers.cpp:16
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, int city, display::Screen2D desiredView, engine::SequencePlayback &playback, bool deedPopupVisible=false)
std::uint32_t DataId
Definition DataBanks.hpp:10
constexpr DataId EmptyDataId
Definition DataBanks.hpp:13
std::uint16_t DataTag
Definition DataBanks.hpp:11
constexpr DataId packDataId(std::uint16_t group, DataTag tag) noexcept
Definition DataBanks.hpp:39
int propertyIndex(int square) noexcept
SequenceTransform moveXYTransform(std::int32_t x, std::int32_t y) noexcept
constexpr std::uint16_t DeedFloaterPriority
constexpr std::uint16_t DeedFloaterCardPriority
std::expected< std::vector< DeedPlayback::Published >, std::string > planDeedGrid(const State &state, const rules::GameState &gameState, const PlayerPlaybackInputs &inputs)
constexpr data::DataTag DeedFloaterCardBaseTag
constexpr data::DataTag DeedFloaterFrameTag