guardian: self guard is no longer an option
This commit is contained in:
parent
3388894504
commit
0bd54a517d
|
|
@ -504,7 +504,11 @@ impl Character {
|
||||||
} => prompts.push(ActionPrompt::Guardian {
|
} => prompts.push(ActionPrompt::Guardian {
|
||||||
character_id: self.identity(),
|
character_id: self.identity(),
|
||||||
previous: Some(PreviousGuardianAction::Protect(prev_target.clone())),
|
previous: Some(PreviousGuardianAction::Protect(prev_target.clone())),
|
||||||
living_players: village.living_players(),
|
living_players: if prev_target.character_id == self.identity.character_id {
|
||||||
|
village.living_players_excluding(prev_target.character_id)
|
||||||
|
} else {
|
||||||
|
village.living_players()
|
||||||
|
},
|
||||||
marked: None,
|
marked: None,
|
||||||
}),
|
}),
|
||||||
Role::Guardian {
|
Role::Guardian {
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ use crate::{
|
||||||
},
|
},
|
||||||
message::{
|
message::{
|
||||||
host::{HostGameMessage, HostNightMessage},
|
host::{HostGameMessage, HostNightMessage},
|
||||||
night::{ActionPromptTitle, ActionResponse},
|
night::{ActionPrompt, ActionPromptTitle, ActionResponse},
|
||||||
},
|
},
|
||||||
role::{PreviousGuardianAction, Role, RoleTitle},
|
role::{PreviousGuardianAction, Role, RoleTitle},
|
||||||
};
|
};
|
||||||
|
|
@ -271,3 +271,60 @@ fn protects_from_militia() {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn cant_self_guard() {
|
||||||
|
init_log();
|
||||||
|
let players = gen_players(1..21);
|
||||||
|
let mut player_ids = players.iter().map(|p| p.player_id);
|
||||||
|
let guardian = player_ids.next().unwrap();
|
||||||
|
let wolf = player_ids.next().unwrap();
|
||||||
|
let mut settings = GameSettings::empty();
|
||||||
|
settings.add_and_assign(SetupRole::Guardian, guardian);
|
||||||
|
settings.add_and_assign(SetupRole::Werewolf, wolf);
|
||||||
|
settings.fill_remaining_slots_with_villagers(20);
|
||||||
|
let mut game = Game::new(&players, settings).unwrap();
|
||||||
|
game.r#continue().r#continue();
|
||||||
|
game.next().title().wolves_intro();
|
||||||
|
game.r#continue().sleep();
|
||||||
|
game.next_expect_day();
|
||||||
|
|
||||||
|
game.execute().title().guardian();
|
||||||
|
game.mark(game.character_by_player_id(guardian).character_id());
|
||||||
|
game.r#continue().sleep();
|
||||||
|
|
||||||
|
game.next().title().wolf_pack_kill();
|
||||||
|
game.mark(game.character_by_player_id(guardian).character_id());
|
||||||
|
game.r#continue().sleep();
|
||||||
|
|
||||||
|
game.next_expect_day();
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
game.character_by_player_id(guardian).died_to().cloned(),
|
||||||
|
None
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
game.character_by_player_id(guardian)
|
||||||
|
.role()
|
||||||
|
.guardian_ref()
|
||||||
|
.unwrap()
|
||||||
|
.last_protected
|
||||||
|
.clone(),
|
||||||
|
Some(PreviousGuardianAction::Protect(
|
||||||
|
game.character_by_player_id(guardian).identity()
|
||||||
|
))
|
||||||
|
);
|
||||||
|
|
||||||
|
match game.execute() {
|
||||||
|
ActionPrompt::Guardian {
|
||||||
|
character_id,
|
||||||
|
previous: Some(PreviousGuardianAction::Protect(prev_protect)),
|
||||||
|
living_players,
|
||||||
|
..
|
||||||
|
} => {
|
||||||
|
assert_eq!(character_id, prev_protect);
|
||||||
|
assert!(!living_players.contains(&character_id));
|
||||||
|
}
|
||||||
|
prompt => panic!("expected guardian prompt, got {prompt:?}"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue