27 [[
nodiscard]] std::expected<std::pair<int, int>, std::string>
28 bitmapSize(
const sequence::SequenceProgram& program)
30 const auto resources = program.resources();
32 return std::unexpected(
"UDStats Bank sequence has no resource snapshot");
34 for (
const auto& description : program.descriptions())
36 if (!std::holds_alternative<data::SequenceBitmapData>(
37 description.record.data) || !description.contentsDataId)
40 const auto id = *description.contentsDataId;
44 return std::unexpected(
"UDStats Bank bitmap dependency failed");
48 if (!
bitmap)
return std::unexpected(
bitmap.error().detail);
54 if (!
bitmap)
return std::unexpected(
bitmap.error().detail);
55 return std::pair{
static_cast<int>(
bitmap->width),
56 static_cast<int>(
bitmap->height)};
58 return std::unexpected(
59 "UDStats Bank 2D sequence content is not a bitmap");
61 return std::unexpected(
"UDStats Bank sequence contains no bitmap record");
64 using Objects = std::vector<BankPlayback::Published>;
76 case 5:
rect = {583,100,619,142};
break;
77 case 12:
rect = {714,100,750,142};
break;
78 case 15:
rect = {583,49,619,91};
break;
79 case 25:
rect = {648,100,684,142};
break;
80 case 28:
rect = {714,49,750,91};
break;
81 case 35:
rect = {648,49,684,91};
break;
117 const auto count = std::min<std::size_t>(
120 state.bankPlayerHotels.begin(),
state.bankPlayerHotels.begin() +
count,
121 [](
int value) { return value > 0; });
127 if (!
hotel)
return std::unexpected(
hotel.error().detail);
129 if (!size)
return std::unexpected(
size.error());
133 state.bankPlayerHouses.begin(),
state.bankPlayerHouses.begin() +
count,
134 [](
int value) { return value > 0; });
137 return std::unexpected(
"UDStats Bank house capacity cannot form retail rows");
144 return std::unexpected(
"UDStats Bank player colour is out of range");
148 const int top = 300 +
static_cast<int>(
colour) * 22;
152 for (
int house = 0; house <
state.bankPlayerHouses[
slot]; ++house)
170 if (!
sold)
return std::unexpected(
sold.error().detail);
179 const auto id =
deedId(square);
185 const auto status =
state.bankDeeds[
static_cast<std::size_t
>(square)];
229 if (visible &&
state.activeSort == 0)
232 if (!objects)
return std::unexpected(objects.error());
235 else if (visible &&
state.activeSort == 1)
238 if (!objects)
return std::unexpected(objects.error());
241 else if (visible &&
state.activeSort == 2)
251 (
state.historyArrowPressed ==
arrow ? 1 : 0));
256 if (
desired == current_)
return {};
258 std::map<data::DataId, std::shared_ptr<const sequence::SequenceProgram>>
programs;
259 for (
const auto&
object :
desired)
261 if (
programs.contains(
object.id))
continue;
264 return std::unexpected(
"UDStats Bank overlay resource failed: " +
269 std::set<std::pair<data::DataId, std::uint16_t>>
stops;
270 for (
const auto&
object : current_)
271 stops.emplace(
object.id,
object.priority);
277 return std::unexpected(
278 "sequence command queue cannot fit UDStats Bank overlay transition");
285 return std::unexpected(
"validated UDStats Bank stop rejected");
288 for (
const auto&
object :
desired)
290 std::optional<sequence::SequenceTransform> transform;
291 if (
object.positioned &&
object.scale != 1.0F)
294 object.
x,
object.
y,
object.scale, 0.0F)};
295 else if (
object.positioned)
298 programs.at(object.id), object.priority, {}, std::move(transform)}))
299 return std::unexpected(
"validated UDStats Bank start rejected");
LegacyBitmapMetadata metadata
std::vector< std::byte > bytes
static constexpr std::size_t Capacity
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, display::Screen2D desiredView, engine::SequencePlayback &playback, const AccountState *accounts=nullptr)
constexpr DataId EmptyDataId
std::expected< LegacyUapMetadata, BitmapError > inspectLegacyUap(std::span< const std::byte > bytes)
constexpr DataId packDataId(std::uint16_t group, DataTag tag) noexcept
std::expected< LegacyBitmapMetadata, BitmapError > inspectLegacyBitmap(std::span< const std::byte > bytes)
int propertyIndex(int square) noexcept
constexpr std::size_t MaxPlayerColours
constexpr std::size_t SquareCount
constexpr PlayerNumber MaxPlayers
std::variant< std::monostate, Matrix2D, Matrix3D > SequenceTransform
Matrix2D moveXYSRTransform(std::int32_t x, std::int32_t y, float scale, float rotate) noexcept
SequenceTransform moveXYTransform(std::int32_t x, std::int32_t y) noexcept
std::shared_ptr< const data::ResourceSnapshot > resources() noexcept
constexpr data::DataTag BankSoldSignTag
data::DataId bankDeedSequence(int square) noexcept
constexpr data::DataTag BankLiabilityDividendCardTag
constexpr data::DataTag BankHotelTag
std::optional< Rect > bankDeedRect(int square) noexcept
constexpr int BankContentX
constexpr int BankDeedWidth
constexpr int BankDeedHeight
constexpr data::DataTag BankDeedBaseTag
constexpr std::uint16_t BankOverlayPriority
constexpr data::DataTag BankHouseTag
constexpr int BankContentY
constexpr data::DataTag BankPlayerBarBaseTag
constexpr data::DataTag BankLiabilityErrorCardTag
constexpr data::DataTag BankMortgageSignTag
constexpr std::uint16_t BankIconPriority
constexpr float BankLiabilityCardScale
constexpr std::uint16_t BankSignPriority