-
- // ── Side panel ───────────────────────────────────────────────
-
- // Status message
-
- {move || {
- let n = staged_moves.get().len();
- if is_move_stage {
- t_string!(i18n, select_move, n = n + 1)
- } else {
- String::from(match (&stage, is_my_turn, &turn_stage) {
- (SerStage::Ended, _, _) => t_string!(i18n, game_over),
- (SerStage::PreGame, _, _) => t_string!(i18n, waiting_for_opponent),
- (SerStage::InGame, true, SerTurnStage::RollDice) => t_string!(i18n, your_turn_roll),
- (SerStage::InGame, true, SerTurnStage::HoldOrGoChoice) => t_string!(i18n, hold_or_go),
- (SerStage::InGame, true, _) => t_string!(i18n, your_turn),
- (SerStage::InGame, false, _) => t_string!(i18n, opponent_turn),
- })
- }
- }}
-
-
- // Dice (always shown when rolled, used state depends on whose turn)
- {show_dice.then(|| view! {
-
- {move || {
- let (d0, d1) = if is_move_stage {
- matched_dice_used(&staged_moves.get(), dice)
- } else {
- (true, true)
- };
- view! {
-
-
- }
- }}
-
- })}
-
- // Action buttons
-
- {show_roll.then(|| view! {
-
- })}
- {show_hold_go.then(|| view! {
-
- })}
- {move || {
- // Show the empty-move button only when (0,0) is a valid
- // first or second move given what has already been staged.
- let staged = staged_moves.get();
- let show = is_move_stage && staged.len() < 2 && (
- valid_seqs_empty.is_empty() || match staged.len() {
- 0 => valid_seqs_empty.iter().any(|(m1, _)| m1.get_from() == 0),
- 1 => {
- let (f0, t0) = staged[0];
- valid_seqs_empty.iter()
- .filter(|(m1, _)| {
- m1.get_from() as u8 == f0
- && m1.get_to() as u8 == t0
- })
- .any(|(_, m2)| m2.get_from() == 0)
- }
- _ => false,
- }
- );
- show.then(|| view! {
-
- })
- }}
-
-