16 using Objects = std::vector<PlayerAuxPlayback::Published>;
48 [[
nodiscard]] std::expected<std::pair<int, int>, std::string>
49 bitmapSize(
const sequence::SequenceProgram& program)
51 const auto resources = program.resources();
53 return std::unexpected(
"UDStats Player aux sequence has no resources");
54 for (
const auto& description : program.descriptions())
56 if (!std::holds_alternative<data::SequenceBitmapData>(
57 description.record.data) || !description.contentsDataId)
60 const auto id = *description.contentsDataId;
64 return std::unexpected(
"UDStats Player aux bitmap dependency failed");
68 if (!
bitmap)
return std::unexpected(
bitmap.error().detail);
74 if (!
bitmap)
return std::unexpected(
bitmap.error().detail);
75 return std::pair{
static_cast<int>(
bitmap->width),
76 static_cast<int>(
bitmap->height)};
79 return std::unexpected(
"UDStats Player aux sequence contains no bitmap");
87 [&](
const rules::CountHitRecord&
hit)
89 return hit.toPlayer == player && hit.hitType == type;
95 const PlayerPlaybackInputs&
inputs,
99 const auto count = std::min<std::size_t>(
state.playerCount,
110 return std::unexpected(
"UDStats Future icon failed: " +
115 return std::unexpected(
"UDStats Immunity icon failed: " +
127 return std::unexpected(
"UDStats Player aux references invalid player");
157 static_cast<int>(
deck) * 30});
166 state.modernJailLayoutQualified =
false;
167 const auto resources =
playback.resources();
168 if (!
state.modernPlayerLayout || !resources ||
state.playerCount <= 4 ||
172 constexpr std::array<std::array<int,4>,2> expected{{{{43,28,737,524}},{{42,26,714,504}}}};
173 for (std::size_t
deck = 0;
deck < expected.size(); ++
deck)
176 const auto metadata = resources->data().metadata(
id);
177 const auto bytes = resources->data().load(
id);
180 const auto&
e = expected[
deck];
184 state.modernJailLayoutQualified =
true;
189 std::vector<FutureImmunityIcon> result;
190 result.reserve(current_.size());
191 for (
const auto&
object : current_)
192 if (
object.icon) result.push_back(*
object.icon);
211 if (
desired == current_)
return {};
214 std::shared_ptr<const sequence::SequenceProgram>>
programs;
215 for (
const auto&
object :
desired)
217 if (
programs.contains(
object.id))
continue;
221 return std::unexpected(
222 "UDStats Player aux resource failed: " +
loaded.error().detail);
225 std::set<std::pair<data::DataId, std::uint16_t>>
stops;
226 for (
const auto&
object : current_)
227 stops.emplace(
object.id,
object.priority);
233 return std::unexpected(
234 "sequence command queue cannot fit UDStats Player aux transition");
241 return std::unexpected(
"validated UDStats Player aux stop rejected");
244 for (
const auto&
object :
desired)
249 return std::unexpected(
"validated UDStats Player aux 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, const PlayerPlaybackInputs &inputs, display::Screen2D desiredView, engine::SequencePlayback &playback)
void prepareLayout(State &state, const engine::SequencePlayback &playback) const
std::vector< FutureImmunityIcon > iconHits() const
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)
std::vector< ObjectSpec > catalog(bool europe)
std::uint8_t PlayerNumber
constexpr PlayerNumber MaxPlayers
SequenceTransform moveXYTransform(std::int32_t x, std::int32_t y) noexcept
std::shared_ptr< const data::ResourceSnapshot > resources() noexcept
constexpr std::uint16_t PlayerAuxPriority
constexpr data::DataTag PlayerFutureUsTag
constexpr data::DataTag PlayerFutureEuropeTag
constexpr data::DataTag PlayerJailEuropeBaseTag
bool modernPlayerGridActive(const State &state, const rules::GameState &gameState, rules::PlayerNumber player) noexcept
constexpr data::DataTag PlayerImmunityUsTag
constexpr data::DataTag PlayerImmunityEuropeTag
constexpr data::DataTag PlayerJailUsBaseTag