Compare commits

..

3 Commits

Author SHA1 Message Date
emilis 060180579d
skip prompt button 2026-02-01 22:58:15 +00:00
emilis 2b704ddff6
update copyright header year for old files 2026-02-01 22:18:27 +00:00
emilis 16e8a6ffa5
update mason leader icon 2026-02-01 22:17:18 +00:00
149 changed files with 416 additions and 248 deletions

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,5 +1,5 @@
use convert_case::Casing;
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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
@ -171,6 +171,10 @@ impl Game {
settings: village.settings(),
})
}
(GameState::Night { night }, HostGameMessage::Night(HostNightMessage::SkipAction)) => {
night.skip_action()?;
self.process(HostGameMessage::GetState)
}
(GameState::Night { night }, HostGameMessage::GetState) => {
if let Some(res) = night.current_result() {
return Ok(ServerToHostMessage::ActionResult(

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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
@ -421,6 +421,23 @@ 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(
mut action_queue: VecDeque<ActionPrompt>,
reverting: CharacterId,

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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
@ -69,7 +69,7 @@ pub struct NightChoice {
impl NightChoice {
pub fn new(prompt: ActionPrompt, result: ActionResult, village: &Village) -> Option<Self> {
Some(Self {
(result != ActionResult::SkippedByHost).then_some(Self {
prompt: StoryActionPrompt::new(prompt, village)?,
result: StoryActionResult::new(result),
})
@ -107,6 +107,7 @@ pub enum StoryActionResult {
impl StoryActionResult {
pub fn new(result: ActionResult) -> Option<Self> {
Some(match result {
ActionResult::SkippedByHost => return None,
ActionResult::ShiftFailed => Self::ShiftFailed,
ActionResult::BeholderSawNothing => Self::BeholderSawNothing,
ActionResult::BeholderSawEverything => Self::BeholderSawEverything,

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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
@ -18,6 +18,7 @@ mod night_order;
mod previous;
mod revert;
mod role;
mod skip;
use crate::{
character::{Character, CharacterId},
@ -339,9 +340,30 @@ pub trait GameExt {
fn next_expect_game_over(&mut self) -> GameOver;
fn prev(&mut self) -> ServerToHostMessage;
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 {
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 {
self.process(HostGameMessage::PreviousState).unwrap()
}

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -0,0 +1,78 @@
// 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 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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
@ -60,6 +60,7 @@ pub enum HostNightMessage {
ActionResponse(ActionResponse),
Next,
NextPage,
SkipAction,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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
@ -623,6 +623,7 @@ pub enum ActionResult {
GoBackToSleep,
ShiftFailed,
Continue,
SkippedByHost,
}
impl ActionResult {
@ -660,7 +661,8 @@ impl ActionResult {
| ActionResult::Mortician(_, _)
| ActionResult::Insomniac(_)
| ActionResult::GoBackToSleep
| ActionResult::Continue => return None,
| ActionResult::Continue
| ActionResult::SkippedByHost => return None,
})
}
}

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,7 +1,7 @@
use serde::{Deserialize, Serialize};
use werewolves_macros::ChecksAs;
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -2,104 +2,115 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="126.23896mm"
height="51.465496mm"
viewBox="0 0 126.23896 51.465496"
width="82.665497mm"
height="93.698868mm"
viewBox="0 0 82.665497 93.698868"
version="1.1"
id="svg1"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
sodipodi:docname="icons.svg"
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: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
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs1" /><g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="Layer 4"
transform="translate(-287.79055,-536.67755)"><g
id="g110"
transform="translate(-38.629167,49.2125)"><g
id="g109"><g
id="g108"
transform="translate(-15.715448,-1.8708867)"><rect
style="fill:#bb402d;fill-opacity:1;stroke:#3e150f;stroke-width:1.265;stroke-dasharray:none;stroke-opacity:1"
id="rect107"
width="40"
height="15"
x="342.7677"
y="525.16895" /><rect
style="fill:#bb402d;fill-opacity:1;stroke:#3e150f;stroke-width:1.265;stroke-dasharray:none;stroke-opacity:1"
id="rect107-5"
width="40"
height="15"
x="385.35562"
y="525.16895" /></g><rect
style="fill:#bb402d;fill-opacity:1;stroke:#3e150f;stroke-width:1.265;stroke-dasharray:none;stroke-opacity:1"
id="rect107-0"
width="40"
height="15"
x="348.34619"
y="505.69763" /></g><g
id="g109-6"
transform="matrix(1,0,0,-1,42.386031,1026.3956)"><g
id="g108-8"
transform="translate(-15.715448,-1.8708867)"><rect
style="fill:#bb402d;fill-opacity:1;stroke:#3e150f;stroke-width:1.265;stroke-dasharray:none;stroke-opacity:1"
id="rect107-9"
width="40"
height="15"
x="342.7677"
y="525.16895" /><rect
style="fill:#bb402d;fill-opacity:1;stroke:#3e150f;stroke-width:1.265;stroke-dasharray:none;stroke-opacity:1"
id="rect107-5-2"
width="40"
height="15"
x="385.35562"
y="525.16895" /></g><rect
style="fill:#bb402d;fill-opacity:1;stroke:#3e150f;stroke-width:1.265;stroke-dasharray:none;stroke-opacity:1"
id="rect107-0-6"
width="40"
height="15"
x="348.34619"
y="505.69763" /></g></g></g></svg>
id="layer3"
transform="translate(-617.41613,-892.54217)"><g
id="g39"><g
id="g36"
transform="translate(101.97657,24.077083)"
style="fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-opacity:1"><path
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"
style="opacity:1;fill:#8c8cd8;fill-opacity:1;stroke:#000000;stroke-width:1.561;stroke-opacity:1"
id="path8" /><g
id="g31"
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" /><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" /><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" /><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" /><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" /><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" /><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" /><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" /><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" /><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" /><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" /><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" /></g><g
id="g31-6"
transform="matrix(-1,0,0,1,1111.8082,0.22285383)"
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: 3.6 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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
@ -560,12 +560,40 @@ impl Component for Host {
}
_ => 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(|| {
html! {
<nav class="host-nav" style="z-index: 3;">
{previous_btn}
{view_roles_btn}
{override_screens_btn}
{skip_btn}
</nav>
}
});

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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
@ -124,7 +124,7 @@ pub fn ActionResultView(props: &ActionResultProps) -> Html {
</CoverOfDarkness>
};
}
ActionResult::Continue => {
ActionResult::SkippedByHost | ActionResult::Continue => {
props.on_complete.emit(HostMessage::GetState);
return html! {
<CoverOfDarkness />

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,6 +1,6 @@
use core::ops::Not;
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

View File

@ -1,4 +1,4 @@
// Copyright (C) 2025 Emilis Bliūdžius
// Copyright (C) 2025-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

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