31 [[
nodiscard]] std::expected<std::shared_ptr<const sequence::SequenceProgram>, std::string>
36 return std::unexpected(
loaded.error().detail);
41 std::vector<sequence::SequenceCommand>& commands,
42 std::shared_ptr<const sequence::SequenceProgram> program,
48 commands.push_back(sequence::StartSequenceCommand{
59 return std::unexpected(
"IBar score strip player count exceeds legacy maximum");
62 const int count =
static_cast<int>(
state.numberOfPlayers);
63 if (
count == 0)
return result;
69 for (
int player = 0; player <
count; ++player)
71 if (!
inputs.visiblePlayers[
static_cast<std::size_t
>(player)])
76 return std::unexpected(
"IBar score token is outside legacy token range");
78 return std::unexpected(
"IBar score colour is outside legacy 0..5 range");
80 auto&
target = result.players[
static_cast<std::size_t
>(player)];
98 for (std::size_t player = 0; player < players_.size(); ++player)
101 auto current = players_[player];
102 const auto&
text = text_[player];
109 if (!current.visible)
111 text_[player] = std::move(
nextText);
114 std::vector<sequence::SequenceCommand> commands;
121 if (current.jailBars)
127 return std::unexpected(
"sequence command queue cannot fit IBar score hide transition");
129 for (
auto& command : commands)
131 const auto queued = std::visit(
138 return std::unexpected(
"validated IBar score hide command rejected");
140 players_[player] = {};
141 text_[player] = std::move(
nextText);
145 const bool changed = !current.visible ||
146 current.token !=
desired.token ||
147 current.colourBar !=
desired.colourBar ||
148 current.jailBars !=
desired.jailBars ||
150 current.hovered !=
desired.hovered;
156 text.lastCashUpdateTick <=
plan.tick - 20u)
168 text_[player] = std::move(
nextText);
176 std::shared_ptr<const sequence::SequenceProgram>
jailProgram;
184 std::vector<sequence::SequenceCommand> commands;
210 return std::unexpected(
"sequence command queue cannot fit IBar score transition");
212 for (
auto& command : commands)
214 const auto queued = std::visit(
221 return std::unexpected(
"validated IBar score command rejected");
227 text_[player] = std::move(
nextText);
decision::EconomicActionPlan plan
std::shared_ptr< const data::HmdTextureImage > source
std::expected< void, std::string > sync(const ScoreStripPlan &plan, engine::SequencePlayback &playback)
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={})
constexpr DataId EmptyDataId
constexpr DataId packDataId(std::uint16_t group, DataTag tag) noexcept
int scoreX(int playerIndex, int numberOfPlayers, int playerWidth) noexcept
int scoreBoxWidth(int numberOfPlayers) noexcept
constexpr std::uint16_t ScoreBoxPriority
constexpr data::DataTag ScoreJailBarsTag
constexpr data::DataTag ScoreLargeColourBaseTag
constexpr std::uint8_t ScorePlayerColourCount
constexpr std::uint16_t ScoreGeneralPriority
constexpr data::DataTag ScoreTokenBaseTag
constexpr data::DataTag ScoreSmallColourBaseTag
std::expected< ScoreStripPlan, std::string > planScoreStrip(const rules::GameState &state, const ScoreStripInputs &inputs)
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::array< PlayerDisplay, rules::MaxPlayers > players