From 567e023a73bbe96f5c663948ada455aac5fc1e2c Mon Sep 17 00:00:00 2001 From: emilis Date: Sun, 22 Feb 2026 23:43:09 +0000 Subject: [PATCH] fix: picking dead players in daytime view --- style/main.scss | 5 +++++ werewolves-proto/src/game/mod.rs | 5 ++++- werewolves/src/app/pages/game.rs | 11 ++++++++++- werewolves/src/app/pages/game/big.rs | 17 ++++++++++++++--- werewolves/src/app/pages/game/host.rs | 3 +++ werewolves/src/app/pages/game/host/daytime.rs | 9 ++++++--- werewolves/src/app/pages/game/player.rs | 1 + .../app/pages/night_actions/night_actions.rs | 6 +++++- .../src/app/pages/night_actions/result.rs | 2 +- .../app/pages/night_actions/role/arcanist.rs | 7 +++++-- 10 files changed, 54 insertions(+), 12 deletions(-) diff --git a/style/main.scss b/style/main.scss index 11106e0..3580b5f 100644 --- a/style/main.scss +++ b/style/main.scss @@ -1051,6 +1051,11 @@ form { background-color: color.change($red2, $alpha: 0.3); border: 1px solid color.change($red2, $alpha: 0.8); } + + &.dead { + filter: grayscale(100%); + cursor: default; + } } } diff --git a/werewolves-proto/src/game/mod.rs b/werewolves-proto/src/game/mod.rs index 6cb3dd4..fbf7f7d 100644 --- a/werewolves-proto/src/game/mod.rs +++ b/werewolves-proto/src/game/mod.rs @@ -213,9 +213,12 @@ impl Game { self.process(HostGameMessage::GetState) } ( - GameState::Day { village: _, marked }, + GameState::Day { village, marked }, HostGameMessage::Day(HostDayMessage::MarkForExecution(target)), ) => { + if village.character_by_id(target)?.died_to().is_some() { + return Err(GameError::CharacterAlreadyDead); + } match marked .iter() .enumerate() diff --git a/werewolves/src/app/pages/game.rs b/werewolves/src/app/pages/game.rs index 774ecd6..f806512 100644 --- a/werewolves/src/app/pages/game.rs +++ b/werewolves/src/app/pages/game.rs @@ -10,6 +10,8 @@ use leptos_use::{ use_websocket_with_options, }; use reactive_stores::Store; +use sorted_vec::SortedSet; +use werewolves_proto::message::dead::DeadChatMessage; use werewolves_proto::message::host::ServerToHostMessage; use werewolves_proto::message::{ClientMessage, host::HostMessage}; use werewolves_proto::message::{IntoClientResponse, WrappedServerMessage}; @@ -28,6 +30,7 @@ use crate::{ #[component] pub fn GamePage(error: WriteSignal>) -> impl IntoView { + let dead_chat_messages: RwSignal> = RwSignal::new(SortedSet::new()); move || { let params = hooks::use_params_map(); let auth = expect_context::>(); @@ -197,12 +200,18 @@ pub fn GamePage(error: WriteSignal>) -> impl IntoView { view! { {status} - + } } diff --git a/werewolves/src/app/pages/game/big.rs b/werewolves/src/app/pages/game/big.rs index e777cf4..11d2bcc 100644 --- a/werewolves/src/app/pages/game/big.rs +++ b/werewolves/src/app/pages/game/big.rs @@ -1,5 +1,5 @@ werewolves_macros::include_path!("werewolves/src/app/pages/game/big"); -use core::str::FromStr; +use core::{ops::DerefMut, str::FromStr}; use crate::{ ConsoleLogError, @@ -14,6 +14,7 @@ use crate::{ }, }; use codee::binary::MsgpackSerdeCodec; +use gloo::history::History; use leptos::prelude::*; use leptos_router::hooks; use leptos_use::{ @@ -21,10 +22,12 @@ use leptos_use::{ use_websocket_with_options, }; use reactive_stores::Store; +use sorted_vec::SortedSet; use werewolves_proto::{ game::GameId, message::{ CharacterIdentity, IntoClientResponse, WrappedServerMessage, + dead::DeadChatMessage, host::ServerToHostMessage, night::{ActionPrompt, ActionResult}, }, @@ -51,6 +54,7 @@ enum BigScreenPage { #[component] pub fn BigScreen() -> impl IntoView { + let dead_chat_messages: RwSignal> = RwSignal::new(SortedSet::new()); move || { let params = hooks::use_params_map(); let auth = expect_context::>(); @@ -210,8 +214,15 @@ pub fn BigScreen() -> impl IntoView { page.set(BigScreenPage::RoleReveal); } ServerToHostMessage::Story { story, page } => todo!(), - ServerToHostMessage::DeadChat(dead_chat_messages) => todo!(), - ServerToHostMessage::DeadChatMessage(dead_chat_message) => todo!(), + ServerToHostMessage::DeadChat(m) => { + let mut dcm = dead_chat_messages.write(); + for msg in m { + dcm.push(msg); + } + } + ServerToHostMessage::DeadChatMessage(msg) => { + dead_chat_messages.write().push(msg); + } } }); diff --git a/werewolves/src/app/pages/game/host.rs b/werewolves/src/app/pages/game/host.rs index 5af34a5..c2b81ee 100644 --- a/werewolves/src/app/pages/game/host.rs +++ b/werewolves/src/app/pages/game/host.rs @@ -7,11 +7,13 @@ use core::{num::NonZeroU8, ops::Not}; use std::collections::HashMap; use leptos::prelude::*; +use sorted_vec::SortedSet; use werewolves_proto::{ character::CharacterId, game::{Category, GameSettings}, message::{ CharacterIdentity, CharacterState, PlayerState, + dead::DeadChatMessage, host::{HostGameMessage, HostLobbyMessage, HostMessage, ServerToHostMessage as Srv2Host}, night::{ActionPrompt, ActionResult}, }, @@ -55,6 +57,7 @@ pub fn HostGamePage( error: WriteSignal>, message: Signal>, reply: WriteSignal>, + dead_chat_messages: RwSignal>, ) -> impl IntoView { let prefs = expect_context::<(Signal, WriteSignal)>().0; let page = RwSignal::new(HostPage::default()); diff --git a/werewolves/src/app/pages/game/host/daytime.rs b/werewolves/src/app/pages/game/host/daytime.rs index 49d0e45..aeeca8f 100644 --- a/werewolves/src/app/pages/game/host/daytime.rs +++ b/werewolves/src/app/pages/game/host/daytime.rs @@ -161,10 +161,13 @@ fn DaytimePlayer( .. } = character; let character_id = identity.character_id; + let dead = died_to.is_some(); let select = move |_| { - reply.set(Some(HostMessage::InGame(HostGameMessage::Day( - HostDayMessage::MarkForExecution(character_id), - )))) + if !dead { + reply.set(Some(HostMessage::InGame(HostGameMessage::Day( + HostDayMessage::MarkForExecution(character_id), + )))) + } }; let icon = role.icon().unwrap_or_else(|| role.alignment().icon()); diff --git a/werewolves/src/app/pages/game/player.rs b/werewolves/src/app/pages/game/player.rs index 7ecf3d5..50f568c 100644 --- a/werewolves/src/app/pages/game/player.rs +++ b/werewolves/src/app/pages/game/player.rs @@ -39,6 +39,7 @@ pub fn PlayerGamePage( message: Signal>, reply: WriteSignal>, disconnect: RwSignal, + dead_chat_messages: RwSignal>, ) -> impl IntoView { let dead_chat: RwSignal>> = RwSignal::new(None); let page: RwSignal> = RwSignal::new(None); diff --git a/werewolves/src/app/pages/night_actions/night_actions.rs b/werewolves/src/app/pages/night_actions/night_actions.rs index 51e17c7..599bd12 100644 --- a/werewolves/src/app/pages/night_actions/night_actions.rs +++ b/werewolves/src/app/pages/night_actions/night_actions.rs @@ -360,7 +360,11 @@ pub fn TargetPicker( }) .collect_view(); - view! {
{targets}
} + view! { +
+ {targets} +
+ } } #[component] diff --git a/werewolves/src/app/pages/night_actions/result.rs b/werewolves/src/app/pages/night_actions/result.rs index 9ababcc..4b69079 100644 --- a/werewolves/src/app/pages/night_actions/result.rs +++ b/werewolves/src/app/pages/night_actions/result.rs @@ -46,7 +46,7 @@ pub fn RoleResult( .into_any(), None => view! { }.into_any(), }, - ActionResult::ShiftFailed => view!{}.into_any(), + ActionResult::ShiftFailed => view! { }.into_any(), ActionResult::SkippedByHost | ActionResult::Continue => { Effect::new(move || { diff --git a/werewolves/src/app/pages/night_actions/role/arcanist.rs b/werewolves/src/app/pages/night_actions/role/arcanist.rs index 7d1f30e..5f8b9c2 100644 --- a/werewolves/src/app/pages/night_actions/role/arcanist.rs +++ b/werewolves/src/app/pages/night_actions/role/arcanist.rs @@ -39,9 +39,12 @@ pub fn ArcanistResult( targets: (PublicIdentity, PublicIdentity), ) -> impl IntoView { let text = match value { - AlignmentEq::Same => view! {"ARE THE SAME"}.into_any(), + AlignmentEq::Same => view! { "ARE THE SAME" }.into_any(), AlignmentEq::Different => { - view! {"ARE ""DIFFERENT"}.into_any() + view! { + "ARE " + "DIFFERENT" + }.into_any() } }; let icons = match value {