feat: hold or go
This commit is contained in:
parent
82e34e78af
commit
fbd5976d88
|
|
@ -514,6 +514,7 @@ impl GameState {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mark_points(&mut self, player_id: PlayerId, points: u8) -> bool {
|
fn mark_points(&mut self, player_id: PlayerId, points: u8) -> bool {
|
||||||
|
// Update player points and holes
|
||||||
let mut new_hole = false;
|
let mut new_hole = false;
|
||||||
self.players.get_mut(&player_id).map(|p| {
|
self.players.get_mut(&player_id).map(|p| {
|
||||||
let sum_points = p.points + points;
|
let sum_points = p.points + points;
|
||||||
|
|
@ -525,10 +526,35 @@ impl GameState {
|
||||||
};
|
};
|
||||||
|
|
||||||
new_hole = holes > 0;
|
new_hole = holes > 0;
|
||||||
|
if new_hole {
|
||||||
|
p.can_bredouille = true;
|
||||||
|
}
|
||||||
p.points = sum_points % 12;
|
p.points = sum_points % 12;
|
||||||
p.holes += holes;
|
p.holes += holes;
|
||||||
p
|
p
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Opponent updates
|
||||||
|
let maybe_op = if player_id == self.active_player_id {
|
||||||
|
self.get_opponent_id()
|
||||||
|
} else {
|
||||||
|
Some(player_id)
|
||||||
|
};
|
||||||
|
if let Some(opp_id) = maybe_op {
|
||||||
|
if points > 0 {
|
||||||
|
self.players.get_mut(&opp_id).map(|opponent| {
|
||||||
|
// Cancel opponent bredouille
|
||||||
|
opponent.can_bredouille = false;
|
||||||
|
// Reset opponent points if the player finished a hole
|
||||||
|
if new_hole {
|
||||||
|
opponent.points = 0;
|
||||||
|
opponent.can_bredouille = true;
|
||||||
|
}
|
||||||
|
opponent
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
new_hole
|
new_hole
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -614,6 +640,7 @@ mod tests {
|
||||||
assert_eq!(player.holes, 2); // because can bredouille
|
assert_eq!(player.holes, 2); // because can bredouille
|
||||||
assert_eq!(game_state.turn_stage, TurnStage::HoldOrGoChoice);
|
assert_eq!(game_state.turn_stage, TurnStage::HoldOrGoChoice);
|
||||||
|
|
||||||
|
// Go
|
||||||
game_state.consume(
|
game_state.consume(
|
||||||
&(GameEvent::Go {
|
&(GameEvent::Go {
|
||||||
player_id: game_state.active_player_id,
|
player_id: game_state.active_player_id,
|
||||||
|
|
@ -623,5 +650,29 @@ mod tests {
|
||||||
let player = game_state.get_active_player().unwrap();
|
let player = game_state.get_active_player().unwrap();
|
||||||
assert_eq!(player.points, 0);
|
assert_eq!(player.points, 0);
|
||||||
assert_eq!(game_state.turn_stage, TurnStage::RollDice);
|
assert_eq!(game_state.turn_stage, TurnStage::RollDice);
|
||||||
|
|
||||||
|
// Hold
|
||||||
|
let mut game_state = init_test_gamestate(TurnStage::MarkPoints);
|
||||||
|
let pid = game_state.active_player_id;
|
||||||
|
game_state.consume(
|
||||||
|
&(GameEvent::Mark {
|
||||||
|
player_id: pid,
|
||||||
|
points: 13,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
let moves = (
|
||||||
|
CheckerMove::new(1, 3).unwrap(),
|
||||||
|
CheckerMove::new(1, 3).unwrap(),
|
||||||
|
);
|
||||||
|
game_state.consume(
|
||||||
|
&(GameEvent::Move {
|
||||||
|
player_id: game_state.active_player_id,
|
||||||
|
moves,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
assert_ne!(game_state.active_player_id, pid);
|
||||||
|
assert_eq!(game_state.players.get(&pid).unwrap().points, 1);
|
||||||
|
assert_eq!(game_state.get_active_player().unwrap().points, 0);
|
||||||
|
assert_eq!(game_state.turn_stage, TurnStage::RollDice);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue