Compare commits

..

No commits in common. "060180579ded7989fe19da7a0ac1f4fe03025a6f" and "e536edfc287161f17da205ba52e2ff442beec250" have entirely different histories.

149 changed files with 248 additions and 416 deletions

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,5 +1,5 @@
use convert_case::Casing; use convert_case::Casing;
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -171,10 +171,6 @@ impl Game {
settings: village.settings(), settings: village.settings(),
}) })
} }
(GameState::Night { night }, HostGameMessage::Night(HostNightMessage::SkipAction)) => {
night.skip_action()?;
self.process(HostGameMessage::GetState)
}
(GameState::Night { night }, HostGameMessage::GetState) => { (GameState::Night { night }, HostGameMessage::GetState) => {
if let Some(res) = night.current_result() { if let Some(res) = night.current_result() {
return Ok(ServerToHostMessage::ActionResult( return Ok(ServerToHostMessage::ActionResult(

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -421,23 +421,6 @@ impl Night {
}) })
} }
pub fn skip_action(&mut self) -> Result<()> {
match &mut self.night_state {
NightState::Active {
current_result,
current_changes,
..
} => {
*current_result = CurrentResult::GoBackToSleepAfterShown {
result_with_data: ActionResult::SkippedByHost,
};
current_changes.clear();
}
NightState::Complete => return Err(GameError::NightOver),
}
self.next()
}
fn remove_reverted_prompts( fn remove_reverted_prompts(
mut action_queue: VecDeque<ActionPrompt>, mut action_queue: VecDeque<ActionPrompt>,
reverting: CharacterId, reverting: CharacterId,

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -69,7 +69,7 @@ pub struct NightChoice {
impl NightChoice { impl NightChoice {
pub fn new(prompt: ActionPrompt, result: ActionResult, village: &Village) -> Option<Self> { pub fn new(prompt: ActionPrompt, result: ActionResult, village: &Village) -> Option<Self> {
(result != ActionResult::SkippedByHost).then_some(Self { Some(Self {
prompt: StoryActionPrompt::new(prompt, village)?, prompt: StoryActionPrompt::new(prompt, village)?,
result: StoryActionResult::new(result), result: StoryActionResult::new(result),
}) })
@ -107,7 +107,6 @@ pub enum StoryActionResult {
impl StoryActionResult { impl StoryActionResult {
pub fn new(result: ActionResult) -> Option<Self> { pub fn new(result: ActionResult) -> Option<Self> {
Some(match result { Some(match result {
ActionResult::SkippedByHost => return None,
ActionResult::ShiftFailed => Self::ShiftFailed, ActionResult::ShiftFailed => Self::ShiftFailed,
ActionResult::BeholderSawNothing => Self::BeholderSawNothing, ActionResult::BeholderSawNothing => Self::BeholderSawNothing,
ActionResult::BeholderSawEverything => Self::BeholderSawEverything, ActionResult::BeholderSawEverything => Self::BeholderSawEverything,

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -18,7 +18,6 @@ mod night_order;
mod previous; mod previous;
mod revert; mod revert;
mod role; mod role;
mod skip;
use crate::{ use crate::{
character::{Character, CharacterId}, character::{Character, CharacterId},
@ -340,30 +339,9 @@ pub trait GameExt {
fn next_expect_game_over(&mut self) -> GameOver; fn next_expect_game_over(&mut self) -> GameOver;
fn prev(&mut self) -> ServerToHostMessage; fn prev(&mut self) -> ServerToHostMessage;
fn mark_villager(&mut self) -> ActionPrompt; fn mark_villager(&mut self) -> ActionPrompt;
fn skip(&mut self) -> ActionPrompt;
fn skip_expect_day(&mut self) -> (Box<[CharacterState]>, Box<[CharacterId]>, NonZeroU8);
} }
impl GameExt for Game { impl GameExt for Game {
fn skip(&mut self) -> ActionPrompt {
self.process(HostGameMessage::Night(HostNightMessage::SkipAction))
.unwrap()
.prompt()
}
fn skip_expect_day(&mut self) -> (Box<[CharacterState]>, Box<[CharacterId]>, NonZeroU8) {
match self
.process(HostGameMessage::Night(HostNightMessage::SkipAction))
.unwrap()
{
ServerToHostMessage::Daytime {
characters,
marked,
day,
..
} => (characters, marked, day),
other => panic!("expected daytime, got {other:?}"),
}
}
fn prev(&mut self) -> ServerToHostMessage { fn prev(&mut self) -> ServerToHostMessage {
self.process(HostGameMessage::PreviousState).unwrap() self.process(HostGameMessage::PreviousState).unwrap()
} }

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,78 +0,0 @@
// Copyright (C) 2026 Emilis Bliūdžius
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
#[allow(unused)]
use pretty_assertions::{assert_eq, assert_ne, assert_str_eq};
use crate::{
game::{Game, GameSettings, SetupRole},
game_test::{
ActionPromptTitleExt, ActionResultExt, GameExt, SettingsExt, gen_players, init_log,
},
message::night::ActionPromptTitle,
};
#[test]
pub fn skip_wolf_kill_all_villagers() {
init_log();
let players = gen_players(1..21);
let mut player_ids = players.iter().map(|p| p.player_id);
let wolf = player_ids.next().unwrap();
let mut settings = GameSettings::empty();
settings.add_and_assign(SetupRole::Werewolf, wolf);
settings.fill_remaining_slots_with_villagers(players.len());
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.skip_expect_day();
assert!(game.village().characters().into_iter().all(|c| c.alive()))
}
#[test]
pub fn skip_wolf_kill_has_seer() {
init_log();
let players = gen_players(1..21);
let mut player_ids = players.iter().map(|p| p.player_id);
let wolf = player_ids.next().unwrap();
let seer = player_ids.next().unwrap();
let mut settings = GameSettings::empty();
settings.add_and_assign(SetupRole::Werewolf, wolf);
settings.add_and_assign(SetupRole::Seer, seer);
settings.fill_remaining_slots_with_villagers(players.len());
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().title().seer();
game.mark(game.character_by_player_id(wolf).character_id());
game.r#continue();
game.r#continue().sleep();
game.next_expect_day();
game.execute().title().wolf_pack_kill();
game.skip().title().seer();
game.mark(game.character_by_player_id(wolf).character_id());
game.r#continue();
game.r#continue().sleep();
game.next_expect_day();
assert!(game.village().characters().into_iter().all(|c| c.alive()))
}

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -60,7 +60,6 @@ pub enum HostNightMessage {
ActionResponse(ActionResponse), ActionResponse(ActionResponse),
Next, Next,
NextPage, NextPage,
SkipAction,
} }
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -623,7 +623,6 @@ pub enum ActionResult {
GoBackToSleep, GoBackToSleep,
ShiftFailed, ShiftFailed,
Continue, Continue,
SkippedByHost,
} }
impl ActionResult { impl ActionResult {
@ -661,8 +660,7 @@ impl ActionResult {
| ActionResult::Mortician(_, _) | ActionResult::Mortician(_, _)
| ActionResult::Insomniac(_) | ActionResult::Insomniac(_)
| ActionResult::GoBackToSleep | ActionResult::GoBackToSleep
| ActionResult::Continue | ActionResult::Continue => return None,
| ActionResult::SkippedByHost => return None,
}) })
} }
} }

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,7 +1,7 @@
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use werewolves_macros::ChecksAs; use werewolves_macros::ChecksAs;
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -2,115 +2,104 @@
<!-- Created with Inkscape (http://www.inkscape.org/) --> <!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg <svg
width="82.665497mm" width="126.23896mm"
height="93.698868mm" height="51.465496mm"
viewBox="0 0 82.665497 93.698868" viewBox="0 0 126.23896 51.465496"
version="1.1" version="1.1"
id="svg1" id="svg1"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
sodipodi:docname="icons.svg"
xml:space="preserve" xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="true"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1"
inkscape:cx="1447"
inkscape:cy="1883.5"
inkscape:window-width="1918"
inkscape:window-height="1042"
inkscape:window-x="0"
inkscape:window-y="17"
inkscape:window-maximized="0"
inkscape:current-layer="layer4"><inkscape:grid
id="grid1"
units="mm"
originx="-287.79055"
originy="-536.67756"
spacingx="0.26458333"
spacingy="0.26458334"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="5"
enabled="true"
visible="false" /><inkscape:page
x="0"
y="0"
width="126.23896"
height="51.465496"
id="page2"
margin="0"
bleed="0" /></sodipodi:namedview><defs
id="defs1" /><g id="defs1" /><g
id="layer3" inkscape:groupmode="layer"
transform="translate(-617.41613,-892.54217)"><g id="layer4"
id="g39"><g inkscape:label="Layer 4"
id="g36" transform="translate(-287.79055,-536.67755)"><g
transform="translate(101.97657,24.077083)" id="g110"
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-opacity:1"><path transform="translate(-38.629167,49.2125)"><g
d="m 525.062,916.05881 -7.01559,7.0156 30.9702,30.9702 7.01559,7.01559 7.0156,-7.01559 30.97072,-30.9702 -7.01611,-7.0156 -30.97021,30.97021 z" id="g109"><g
style="opacity:1;fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1.561;stroke-opacity:1" id="g108"
id="path8" /><g transform="translate(-15.715448,-1.8708867)"><rect
id="g31" style="fill:#bb402d;fill-opacity:1;stroke:#3e150f;stroke-width:1.265;stroke-dasharray:none;stroke-opacity:1"
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-opacity:1"><path id="rect107"
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" width="40"
d="m 525.25144,920.94395 -4.44336,4.44336" height="15"
id="path27" /><path x="342.7677"
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" y="525.16895" /><rect
d="m 526.24756,925.1177 -2.75956,2.94665" style="fill:#bb402d;fill-opacity:1;stroke:#3e150f;stroke-width:1.265;stroke-dasharray:none;stroke-opacity:1"
id="path27-3" /><path id="rect107-5"
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" width="40"
d="m 530.83399,926.47547 -4.44336,4.44336" height="15"
id="path27-6" /><path x="385.35562"
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" y="525.16895" /></g><rect
d="m 531.83011,930.64922 -2.75956,2.94665" style="fill:#bb402d;fill-opacity:1;stroke:#3e150f;stroke-width:1.265;stroke-dasharray:none;stroke-opacity:1"
id="path27-3-1" /><path id="rect107-0"
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" width="40"
d="m 536.37143,931.80702 -4.44336,4.44336" height="15"
id="path27-0" /><path x="348.34619"
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" y="505.69763" /></g><g
d="m 537.36755,935.98077 -2.75956,2.94665" id="g109-6"
id="path27-3-2" /><path transform="matrix(1,0,0,-1,42.386031,1026.3956)"><g
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" id="g108-8"
d="m 541.88504,937.41418 -4.44336,4.44336" transform="translate(-15.715448,-1.8708867)"><rect
id="path27-2" /><path style="fill:#bb402d;fill-opacity:1;stroke:#3e150f;stroke-width:1.265;stroke-dasharray:none;stroke-opacity:1"
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" id="rect107-9"
d="m 542.88116,941.58793 -2.75956,2.94665" width="40"
id="path27-3-28" /><path height="15"
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" x="342.7677"
d="m 546.88277,942.91173 -4.44336,4.44336" y="525.16895" /><rect
id="path27-1" /><path style="fill:#bb402d;fill-opacity:1;stroke:#3e150f;stroke-width:1.265;stroke-dasharray:none;stroke-opacity:1"
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" id="rect107-5-2"
d="m 547.87889,947.08548 -2.75956,2.94665" width="40"
id="path27-3-29" /><path height="15"
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" x="385.35562"
d="m 552.31614,947.72513 -4.44336,4.44336" y="525.16895" /></g><rect
id="path27-7" /><path style="fill:#bb402d;fill-opacity:1;stroke:#3e150f;stroke-width:1.265;stroke-dasharray:none;stroke-opacity:1"
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" id="rect107-0-6"
d="m 553.31226,951.89888 -2.75956,2.94665" width="40"
id="path27-3-8" /></g><g height="15"
id="g31-6" x="348.34619"
transform="matrix(-1,0,0,1,1111.8082,0.22285383)" y="505.69763" /></g></g></g></svg>
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-opacity:1"><path
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 525.25144,920.94395 -4.44336,4.44336"
id="path27-10" /><path
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 526.24756,925.1177 -2.75956,2.94665"
id="path27-3-6" /><path
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 530.83399,926.47547 -4.44336,4.44336"
id="path27-6-3" /><path
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 531.83011,930.64922 -2.75956,2.94665"
id="path27-3-1-2" /><path
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 536.37143,931.80702 -4.44336,4.44336"
id="path27-0-0" /><path
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 537.36755,935.98077 -2.75956,2.94665"
id="path27-3-2-6" /><path
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 541.88504,937.41418 -4.44336,4.44336"
id="path27-2-1" /><path
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 542.88116,941.58793 -2.75956,2.94665"
id="path27-3-28-5" /><path
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 546.88277,942.91173 -4.44336,4.44336"
id="path27-1-5" /><path
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 547.87889,947.08548 -2.75956,2.94665"
id="path27-3-29-4" /><path
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 552.31614,947.72513 -4.44336,4.44336"
id="path27-7-7" /><path
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 553.31226,951.89888 -2.75956,2.94665"
id="path27-3-8-6" /></g></g><path
style="fill:#ffca32;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 659.47394,909.22014 -9.12812,19.11614 -3.24115,0.33073 -22.36748,43.9043 -2.15151,-0.18709 -1.8709,3.46115 h -2.52568 l 32.92761,-73.24524 7.57708,-1.12252 z"
id="path36" /><path
style="fill:#bd8d06;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 658.0238,909.22014 9.12812,19.11614 3.24115,0.33073 22.36748,43.9043 2.15151,-0.18709 1.8709,3.46115 h 2.52568 l -32.92761,-73.24524 -7.57708,-1.12252 z"
id="path36-7" /><circle
style="opacity:1;fill:#ffca32;fill-opacity:1;stroke:#000000;stroke-width:1.561;stroke-opacity:1"
id="path26"
cx="658.00903"
cy="903.32275"
r="10" /><path
style="fill:#0f07ff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 669.34288,930.20553 v 8.86354 h -1.25677 c 0,0 -0.39688,-3.63802 -1.98438,-4.82865 -13.27502,-9.95623 -15.00968,21.46778 -5.09323,21.10053 3.61581,-0.13403 4.7813,-2.34902 4.23334,-7.07761 0,0 -0.19844,-1.12448 -1.19063,-1.45521 -0.99219,-0.33073 -1.65364,-0.19843 -1.65364,-0.19843 l 0.0661,-1.7198 h 8.75784 v 1.91823 c 0,0 -2.3151,-0.19843 -2.64583,0.79375 -0.40835,2.38614 -0.26458,4.85843 -0.26458,7.27604 -2.01447,0 -2.88862,1.57461 -4.92139,2.11667 -2.82003,0.752 -13.60018,1.33116 -15.21354,-11.57552 l -2.44739,-1.52135 2.77812,-1.38907 c 2.45785,-15.60142 15.17401,-12.63375 17.79323,-10.84791 1.45521,0.99218 0.79375,0.59531 0.79375,0.59531 v -2.05052 z"
id="path37-4" /><path
d="m 660.62273,912.96857 a 10,10 0 0 1 -2.22778,0.25166 10,10 0 0 1 -0.48834,-0.0119 l -7.17475,15.02544 -3.24115,0.33073 -10.64328,20.89123 21.54752,21.54753 22.77588,-22.77587 -10.01748,-19.66289 -3.24115,-0.33073 z m -0.46613,17.18964 c 2.74855,-0.0395 5.15024,0.79637 6.13245,1.46606 0.41577,0.28348 0.65875,0.45356 0.79375,0.55191 v -2.00711 h 2.24895 v 8.86354 h -1.25677 c 0,0 -0.39687,-3.63802 -1.98437,-4.82865 -13.27502,-9.95623 -15.00968,21.46777 -5.09323,21.10052 3.61581,-0.13403 4.78129,-2.34901 4.23333,-7.0776 0,0 -0.19843,-1.12448 -1.19062,-1.45521 -0.99219,-0.33073 -1.65365,-0.19844 -1.65365,-0.19844 l 0.0661,-1.71979 h 8.75812 v 1.91823 c 0,0 -2.3151,-0.19843 -2.64583,0.79375 -0.40835,2.38614 -0.26459,4.85843 -0.26459,7.27604 -2.01447,0 -2.88889,1.57461 -4.92166,2.11667 -2.82003,0.752 -13.60018,1.33116 -15.21354,-11.57552 l -2.4474,-1.52136 2.77813,-1.38906 c 1.53615,-9.75089 7.07987,-12.24819 11.66078,-12.31398 z"
id="path38"
style="fill:#0000ff;fill-opacity:0.14902;stroke-width:2;stroke-dasharray:none" /></g></g></svg>

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -560,40 +560,12 @@ impl Component for Host {
} }
_ => None, _ => None,
}; };
let skip_btn = match &self.state {
HostState::Prompt(_, _) | HostState::Result(_, _) => {
let on_skip_click = callback::send_message(
HostMessage::InGame(HostGameMessage::Night(HostNightMessage::SkipAction)),
self.send.clone(),
);
let on_skip_click = {
Callback::from(move |_| {
on_skip_click.emit(());
crate::components::modal::close_modal_by_id("skip-button");
})
};
Some(html! {
<crate::components::modal::Dialog
id={"skip-button"}
button={html!{{"skip"}}}
close_button=false
>
<h2>{"skip the current prompt?"}</h2>
<p>{"if this is the final prompt of the night, you may not be able to go back"}</p>
<Button on_click={on_skip_click}>{"skip prompt"}</Button>
</crate::components::modal::Dialog>
})
}
_ => None,
};
let nav = self.big_screen.not().then(|| { let nav = self.big_screen.not().then(|| {
html! { html! {
<nav class="host-nav" style="z-index: 3;"> <nav class="host-nav" style="z-index: 3;">
{previous_btn} {previous_btn}
{view_roles_btn} {view_roles_btn}
{override_screens_btn} {override_screens_btn}
{skip_btn}
</nav> </nav>
} }
}); });

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -124,7 +124,7 @@ pub fn ActionResultView(props: &ActionResultProps) -> Html {
</CoverOfDarkness> </CoverOfDarkness>
}; };
} }
ActionResult::SkippedByHost | ActionResult::Continue => { ActionResult::Continue => {
props.on_complete.emit(HostMessage::GetState); props.on_complete.emit(HostMessage::GetState);
return html! { return html! {
<CoverOfDarkness /> <CoverOfDarkness />

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,6 +1,6 @@
use core::ops::Not; use core::ops::Not;
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025-2026 Emilis Bliūdžius // Copyright (C) 2025 Emilis Bliūdžius
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

Some files were not shown because too many files have changed in this diff Show More