wip: releve
This commit is contained in:
parent
b624629cad
commit
82e34e78af
|
|
@ -1,6 +1,11 @@
|
||||||
|
#!/usr/bin/env -S just --justfile
|
||||||
|
# ^ A shebang isn't required, but allows a justfile to be executed
|
||||||
|
# like a script, with `./justfile test`, for example.
|
||||||
|
|
||||||
|
doc:
|
||||||
|
cargo doc --no-deps
|
||||||
shell:
|
shell:
|
||||||
devenv shell
|
devenv shell
|
||||||
# nix develop
|
|
||||||
startserver:
|
startserver:
|
||||||
RUST_LOG=trictrac_server cargo run --bin trictrac-server
|
RUST_LOG=trictrac_server cargo run --bin trictrac-server
|
||||||
startclient1:
|
startclient1:
|
||||||
|
|
@ -95,6 +95,10 @@ impl GameState {
|
||||||
self.schools_enabled = schools_enabled;
|
self.schools_enabled = schools_enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_active_player(&self) -> Option<&Player> {
|
||||||
|
self.players.get(&self.active_player_id)
|
||||||
|
}
|
||||||
|
|
||||||
fn get_opponent_id(&self) -> Option<PlayerId> {
|
fn get_opponent_id(&self) -> Option<PlayerId> {
|
||||||
self.players
|
self.players
|
||||||
.keys()
|
.keys()
|
||||||
|
|
@ -404,8 +408,10 @@ impl GameState {
|
||||||
}
|
}
|
||||||
Roll { player_id: _ } => {
|
Roll { player_id: _ } => {
|
||||||
// Opponent has moved, we can mark pending points earned during opponent's turn
|
// Opponent has moved, we can mark pending points earned during opponent's turn
|
||||||
self.mark_points(self.active_player_id, self.dice_points.1);
|
let new_hole = self.mark_points(self.active_player_id, self.dice_points.1);
|
||||||
if self.stage != Stage::Ended {
|
if new_hole && self.get_active_player().unwrap().holes > 12 {
|
||||||
|
self.stage = Stage::Ended;
|
||||||
|
} else {
|
||||||
self.turn_stage = TurnStage::RollWaiting;
|
self.turn_stage = TurnStage::RollWaiting;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -417,15 +423,31 @@ impl GameState {
|
||||||
if !self.schools_enabled {
|
if !self.schools_enabled {
|
||||||
// Schools are not enabled. We mark points automatically
|
// Schools are not enabled. We mark points automatically
|
||||||
// the points earned by the opponent will be marked on its turn
|
// the points earned by the opponent will be marked on its turn
|
||||||
self.mark_points(self.active_player_id, self.dice_points.0);
|
let new_hole = self.mark_points(self.active_player_id, self.dice_points.0);
|
||||||
if self.stage != Stage::Ended {
|
if new_hole {
|
||||||
|
if self.get_active_player().unwrap().holes > 12 {
|
||||||
|
self.stage = Stage::Ended;
|
||||||
|
} else {
|
||||||
|
self.turn_stage = TurnStage::HoldOrGoChoice;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
self.turn_stage = TurnStage::Move;
|
self.turn_stage = TurnStage::Move;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Mark { player_id, points } => {
|
Mark { player_id, points } => {
|
||||||
self.mark_points(*player_id, *points);
|
let new_hole = self.mark_points(*player_id, *points);
|
||||||
if self.stage != Stage::Ended {
|
if new_hole {
|
||||||
|
if self.get_active_player().unwrap().holes > 12 {
|
||||||
|
self.stage = Stage::Ended;
|
||||||
|
} else {
|
||||||
|
self.turn_stage = if self.turn_stage == TurnStage::MarkAdvPoints {
|
||||||
|
TurnStage::RollDice
|
||||||
|
} else {
|
||||||
|
TurnStage::HoldOrGoChoice
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} else {
|
||||||
self.turn_stage = if self.turn_stage == TurnStage::MarkAdvPoints {
|
self.turn_stage = if self.turn_stage == TurnStage::MarkAdvPoints {
|
||||||
TurnStage::RollDice
|
TurnStage::RollDice
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -446,7 +468,6 @@ impl GameState {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.history.push(valid_event.clone());
|
self.history.push(valid_event.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -492,19 +513,23 @@ impl GameState {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mark_points(&mut self, player_id: PlayerId, points: u8) {
|
fn mark_points(&mut self, player_id: PlayerId, points: u8) -> bool {
|
||||||
|
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;
|
||||||
let jeux = sum_points / 12;
|
let jeux = sum_points / 12;
|
||||||
|
let holes = match (jeux, p.can_bredouille) {
|
||||||
p.points = sum_points % 12;
|
|
||||||
p.holes += match (jeux, p.can_bredouille) {
|
|
||||||
(0, _) => 0,
|
(0, _) => 0,
|
||||||
(_, false) => 2 * jeux - 1,
|
(_, false) => 2 * jeux - 1,
|
||||||
(_, true) => 2 * jeux,
|
(_, true) => 2 * jeux,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
new_hole = holes > 0;
|
||||||
|
p.points = sum_points % 12;
|
||||||
|
p.holes += holes;
|
||||||
p
|
p
|
||||||
});
|
});
|
||||||
|
new_hole
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -557,13 +582,46 @@ pub enum GameEvent {
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
fn init_test_gamestate(turn: TurnStage) -> GameState {
|
||||||
fn to_string_id() {
|
|
||||||
let mut state = GameState::default();
|
let mut state = GameState::default();
|
||||||
state.add_player(1, Player::new("player1".into(), Color::White));
|
state.add_player(1, Player::new("player1".into(), Color::White));
|
||||||
state.add_player(2, Player::new("player2".into(), Color::Black));
|
state.add_player(2, Player::new("player2".into(), Color::Black));
|
||||||
|
state.active_player_id = 1;
|
||||||
|
state.turn_stage = turn;
|
||||||
|
state
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn to_string_id() {
|
||||||
|
let state = init_test_gamestate(TurnStage::RollDice);
|
||||||
let string_id = state.to_string_id();
|
let string_id = state.to_string_id();
|
||||||
// println!("string_id : {}", string_id);
|
// println!("string_id : {}", string_id);
|
||||||
assert!(string_id == "Hz88AAAAAz8/IAAAAAQAADAD");
|
assert_eq!(string_id, "Hz88AAAAAz8/IAAAAAQAADAD");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn hold_or_go() {
|
||||||
|
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 player = game_state.get_active_player().unwrap();
|
||||||
|
assert_eq!(player.points, 1);
|
||||||
|
assert_eq!(player.holes, 2); // because can bredouille
|
||||||
|
assert_eq!(game_state.turn_stage, TurnStage::HoldOrGoChoice);
|
||||||
|
|
||||||
|
game_state.consume(
|
||||||
|
&(GameEvent::Go {
|
||||||
|
player_id: game_state.active_player_id,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
assert_eq!(game_state.active_player_id, pid);
|
||||||
|
let player = game_state.get_active_player().unwrap();
|
||||||
|
assert_eq!(player.points, 0);
|
||||||
|
assert_eq!(game_state.turn_stage, TurnStage::RollDice);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue