diff --git a/src/lib.rs b/src/lib.rs index 8cd94a4..343fc0d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -236,8 +236,7 @@ impl Game { player.lose(card, &mut self.discard); } - - pub fn block_challenge(&mut self, block_challenge: BlockChallenge, agents: &[&dyn Agent]) -> CoupResult { + pub fn block_challenge(&mut self, block_challenge: phase::BlockChallenge, agents: &[&dyn Agent]) -> CoupResult { if agents[self.turn].should_block_challenge(&block_challenge) { if self.players[block_challenge.blocker].holds(block_challenge.block_card) { // Player challenged incorrectly, loses influence and turn is forfeit @@ -247,7 +246,7 @@ impl Game { // Player challenged correctly, blocker loses a card self.player_lose_influence(block_challenge.blocker, agents); // Game continues - Ok(Phase::Resolution(Resolution { + Ok(Phase::Resolution(phase::Resolution { action: block_challenge.action, target: block_challenge.target, })) @@ -259,7 +258,7 @@ impl Game { } } - pub fn resolution(&mut self, resolution: Resolution, agents: &[&dyn Agent]) -> CoupResult { + pub fn resolution(&mut self, resolution: phase::Resolution, agents: &[&dyn Agent]) -> CoupResult { let current_player = &mut self.players.get_mut(self.turn).unwrap(); let current_agent = agents[self.turn]; match resolution.action { @@ -305,38 +304,42 @@ impl Game { Ok(Phase::Done) } } +pub mod phase { + use super::{ Card, Action }; + #[derive(PartialEq, Debug)] + pub enum Phase { + Action(Action), + //ActionChallenge(ActionChallenge), + Block(Block), + BlockChallenge(BlockChallenge), + Resolution(Resolution), + Done, + } -#[derive(PartialEq, Debug)] -pub enum Phase { - Action(Action), - //ActionChallenge(ActionChallenge), - Block(Block), - BlockChallenge(BlockChallenge), - Resolution(Resolution), - Done, + #[derive(PartialEq, Debug)] + pub struct Block { + + } + + #[derive(PartialEq, Debug)] + pub struct BlockChallenge { + pub blocker: usize, + pub block_card: Card, + pub action: Action, + pub target: Option, + } + + #[derive(PartialEq, Debug)] + pub struct Resolution { + pub action: Action, + pub target: Option, + } } -#[derive(PartialEq, Debug)] -pub struct Block { - -} - -#[derive(PartialEq, Debug)] -pub struct BlockChallenge { - blocker: usize, - block_card: Card, - action: Action, - target: Option, -} - -#[derive(PartialEq, Debug)] -pub struct Resolution { - action: Action, - target: Option, -} +use phase::Phase; pub trait Agent : fmt::Debug { - fn should_block_challenge(&self, block_challenge: &BlockChallenge) -> bool; + fn should_block_challenge(&self, block_challenge: &phase::BlockChallenge) -> bool; fn exchange(&self, cards: &[Card]) -> [Card; 2]; fn choose_lost_influence(&self, cards: &[Card]) -> Card; } @@ -351,7 +354,7 @@ mod test { struct DummyAgent; impl Agent for DummyAgent { #[allow(unused)] - fn should_block_challenge(&self, block_challenge: &BlockChallenge) -> bool { + fn should_block_challenge(&self, block_challenge: &phase::BlockChallenge) -> bool { $sbc } #[allow(unused)] @@ -389,7 +392,7 @@ mod test { { let mut game = game.clone(); assert_eq!( - game.block_challenge( BlockChallenge { + game.block_challenge( phase::BlockChallenge { blocker: 1, block_card: Contessa, action: Assassinate, @@ -404,7 +407,7 @@ mod test { { let mut game = game.clone(); assert_eq!( - game.block_challenge( BlockChallenge { + game.block_challenge( phase::BlockChallenge { blocker: 1, block_card: Contessa, action: Assassinate, @@ -419,13 +422,13 @@ mod test { { let mut game = game.clone(); assert_eq!( - game.block_challenge( BlockChallenge { + game.block_challenge( phase::BlockChallenge { blocker: 1, block_card: Duke, action: ForeignAid, target: None, }, &[&challenge_agent, &block_agent]), - Ok(Phase::Resolution(Resolution { + Ok(Phase::Resolution(phase::Resolution { action: ForeignAid, target: None, })) @@ -454,7 +457,7 @@ mod test { // Test income { let mut game = game.clone(); - game.resolution(Resolution { + game.resolution(phase::Resolution { action: Income, target: None, }, &[&dummy_agent, &dummy_agent]).unwrap(); @@ -464,7 +467,7 @@ mod test { // Test foreign aid { let mut game = game.clone(); - game.resolution(Resolution { + game.resolution(phase::Resolution { action: ForeignAid, target: None, }, &[&dummy_agent, &dummy_agent]).unwrap(); @@ -474,7 +477,7 @@ mod test { // Test coup / assassinate { let mut game = game.clone(); - game.resolution(Resolution { + game.resolution(phase::Resolution { action: Coup, target: Some(1), }, &[&dummy_agent, &dummy_agent]).unwrap(); @@ -485,7 +488,7 @@ mod test { // Test steal { let mut game = game.clone(); - game.resolution(Resolution { + game.resolution(phase::Resolution { action: Steal, target: Some(1), }, &[&dummy_agent, &dummy_agent]).unwrap(); @@ -496,7 +499,7 @@ mod test { // Test exchange { let mut game = game.clone(); - game.resolution(Resolution { + game.resolution(phase::Resolution { action: Exchange, target: Some(1), }, &[&dummy_agent, &dummy_agent]).unwrap();