24 [[
nodiscard]] std::expected<std::uint32_t, std::string>
27 const auto resources = program.resources();
29 return std::unexpected(
"Trade token sequence has no resource snapshot");
31 for (
const auto& description : program.descriptions())
33 if (!std::holds_alternative<data::SequenceBitmapData>(
34 description.record.data) ||
35 !description.contentsDataId)
38 const auto id = *description.contentsDataId;
41 return std::unexpected(
metadata.error().detail);
44 return std::unexpected(
bytes.error().detail);
50 return std::unexpected(
bitmap.error().detail);
52 return std::unexpected(
"Trade token bitmap width is invalid");
53 return static_cast<std::uint32_t
>(
bitmap->width);
60 return std::unexpected(
bitmap.error().detail);
62 return std::unexpected(
"Trade token UAP width is invalid");
66 return std::unexpected(
67 "Trade token 2D sequence content is not a bitmap");
70 return std::unexpected(
71 "Trade token sequence contains no bitmap record");
79 std::array<TokenSpec, 2>
specs{{
95 return std::unexpected(
"Trade token index is out of range");
111 std::array<std::shared_ptr<const sequence::SequenceProgram>, 2>
programs{};
122 return std::unexpected(
loaded.error().detail);
127 specs[1].
id != current_[1])
131 return std::unexpected(
width.error());
133 return std::unexpected(
"Trade token bitmap is wider than right alignment edge");
137 std::vector<sequence::SequenceCommand> commands;
163 return std::unexpected(
164 "sequence command queue cannot fit Trade token transition");
167 for (
auto& command : commands)
169 const auto queued = std::visit(
176 return std::unexpected(
"validated Trade token command rejected");
std::array< rules::PlayerNumber, rules::MaxPlayers > players
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)
constexpr DataId EmptyDataId
std::expected< LegacyUapMetadata, BitmapError > inspectLegacyUap(std::span< const std::byte > bytes)
std::expected< LegacyBitmapMetadata, BitmapError > inspectLegacyBitmap(std::span< const std::byte > bytes)
constexpr std::size_t MaxTokens
constexpr PlayerNumber MaxPlayers
MoveSequenceCommand makeMoveXY(data::DataId dataId, std::uint16_t priority, std::int32_t x, std::int32_t y) noexcept
std::shared_ptr< const data::ResourceSnapshot > resources() noexcept
constexpr std::int32_t TradeTokenAX
constexpr data::DataId tradeTokenSequence(std::uint8_t token) noexcept
constexpr std::int32_t TradeTokenY
constexpr std::uint16_t TradeTokenBPriority
constexpr std::int32_t TradeTokenRightEdge
constexpr std::uint16_t TradeTokenAPriority