From f034656bef84ac3659a16d3f95ec244e910a38f2 Mon Sep 17 00:00:00 2001 From: emilis Date: Mon, 6 Oct 2025 22:36:58 +0100 Subject: [PATCH] weightlifter role and test --- werewolves-proto/src/game/settings.rs | 5 -- werewolves-proto/src/game/village.rs | 6 +++ werewolves-proto/src/game_test/role/mod.rs | 1 + .../src/game_test/role/weightlifter.rs | 47 +++++++++++++++++++ 4 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 werewolves-proto/src/game_test/role/weightlifter.rs diff --git a/werewolves-proto/src/game/settings.rs b/werewolves-proto/src/game/settings.rs index 6de59d3..eca5731 100644 --- a/werewolves-proto/src/game/settings.rs +++ b/werewolves-proto/src/game/settings.rs @@ -59,11 +59,6 @@ impl GameSettings { } pub fn village_roles_count(&self) -> usize { - log::warn!( - "wolves: {} total: {}", - self.wolves_count(), - self.roles.len() - ); self.roles.len() - self.wolves_count() } diff --git a/werewolves-proto/src/game/village.rs b/werewolves-proto/src/game/village.rs index aea809e..7ee269d 100644 --- a/werewolves-proto/src/game/village.rs +++ b/werewolves-proto/src/game/village.rs @@ -111,6 +111,12 @@ impl Village { pub fn is_game_over(&self) -> Option { let wolves = self.living_wolves_count(); let villagers = self.living_villager_count(); + let weightlifters = self + .living_characters_by_role(RoleTitle::Weightlifter) + .len(); + if weightlifters > 0 && wolves == 1 && villagers == 1 { + return Some(GameOver::VillageWins); + } if wolves == 0 { return Some(GameOver::VillageWins); diff --git a/werewolves-proto/src/game_test/role/mod.rs b/werewolves-proto/src/game_test/role/mod.rs index ab0a9bf..0adcefa 100644 --- a/werewolves-proto/src/game_test/role/mod.rs +++ b/werewolves-proto/src/game_test/role/mod.rs @@ -7,3 +7,4 @@ mod mason; mod pyremaster; mod scapegoat; mod shapeshifter; +mod weightlifter; diff --git a/werewolves-proto/src/game_test/role/weightlifter.rs b/werewolves-proto/src/game_test/role/weightlifter.rs new file mode 100644 index 0000000..07750ac --- /dev/null +++ b/werewolves-proto/src/game_test/role/weightlifter.rs @@ -0,0 +1,47 @@ +use core::num::NonZeroU8; +#[allow(unused)] +use pretty_assertions::{assert_eq, assert_ne, assert_str_eq}; + +use crate::{ + diedto::DiedTo, + game::{Game, GameSettings, OrRandom, SetupRole}, + game_test::{ + ActionPromptTitleExt, ActionResultExt, AlignmentExt, GameExt, ServerToHostMessageExt, + SettingsExt, gen_players, + }, + message::{ + host::{HostDayMessage, HostGameMessage, ServerToHostMessage}, + night::{ActionPrompt, ActionPromptTitle, ActionResult}, + }, + role::Role, +}; + +#[test] +fn mayor_win() { + let players = gen_players(1..4); + let weightlifter_player_id = players[0].player_id; + let wolf_player_id = players[1].player_id; + + let mut settings = GameSettings::empty(); + settings.add_and_assign(SetupRole::Weightlifter, weightlifter_player_id); + settings.add_and_assign(SetupRole::Werewolf, wolf_player_id); + + settings.fill_remaining_slots_with_villagers(3); + let mut game = Game::new(&players, settings).unwrap(); + game.r#continue().r#continue(); + assert_eq!(game.next().title(), ActionPromptTitle::WolvesIntro); + game.r#continue().sleep(); + + game.next_expect_day(); + game.execute().title().wolf_pack_kill(); + game.mark(game.living_villager().character_id()); + game.r#continue().sleep(); + + assert_eq!( + game.process(HostGameMessage::Night( + crate::message::host::HostNightMessage::Next + )) + .unwrap(), + ServerToHostMessage::GameOver(crate::game::GameOver::VillageWins) + ); +}