diff --git a/werewolves-server/src/game.rs b/werewolves-server/src/game.rs index e7a1028..df174b8 100644 --- a/werewolves-server/src/game.rs +++ b/werewolves-server/src/game.rs @@ -7,6 +7,7 @@ use crate::{ lobby::{Lobby, LobbyPlayers}, runner::{IdentifiedClientMessage, Message}, }; +use futures::SinkExt; use tokio::{sync::broadcast::Receiver, time::Instant}; use werewolves_proto::{ error::GameError, @@ -142,6 +143,41 @@ impl GameRunner { Message::Host(_) => { (update_host)(&acks, &mut self.comms); } + Message::Client(IdentifiedClientMessage { + identity: + Identification { + player_id, + public: _, + }, + message: ClientMessage::GetState, + }) => { + let sender = + if let Some(sender) = self.joined_players.get_sender(&player_id).await { + sender + } else { + continue; + }; + if acks.iter().any(|(c, d)| c.player_id() == &player_id && *d) { + // already ack'd just disconnect + sender.send(ServerMessage::Disconnect).log_debug(); + continue; + } + if let Some(char) = self + .game + .village() + .characters() + .iter() + .find(|c| c.player_id() == &player_id) + { + sender + .send(ServerMessage::GameStart { + role: char.role().initial_shown_role(), + }) + .log_debug(); + } else if let Some(sender) = self.joined_players.get_sender(&player_id).await { + sender.send(ServerMessage::GameInProgress).log_debug(); + } + } Message::Client(IdentifiedClientMessage { identity: Identification { @@ -159,6 +195,9 @@ impl GameRunner { .log_debug(); } (update_host)(&acks, &mut self.comms); + if let Some(sender) = self.joined_players.get_sender(&player_id).await { + sender.send(ServerMessage::Disconnect).log_debug(); + } } Message::Client(IdentifiedClientMessage { identity: diff --git a/werewolves/index.scss b/werewolves/index.scss index d72b047..d1ccfd4 100644 --- a/werewolves/index.scss +++ b/werewolves/index.scss @@ -7,6 +7,39 @@ $client_shadow_color_2: hsl(240, 55%, 61%); $client_filter: drop-shadow(5px 5px 0 $client_shadow_color) drop-shadow(5px 5px 0 $client_shadow_color_2); +@mixin flexbox() { + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; +} + +@mixin flex($values) { + -webkit-box-flex: $values; + -moz-box-flex: $values; + -webkit-flex: $values; + -ms-flex: $values; + flex: $values; +} + +@mixin order($val) { + -webkit-box-ordinal-group: $val; + -moz-box-ordinal-group: $val; + -ms-flex-order: $val; + -webkit-order: $val; + order: $val; +} + +.wrapper { + @include flexbox(); +} + +.item { + @include flex(1 200px); + @include order(2); +} + html, body { margin: 0; @@ -738,19 +771,58 @@ input { zoom: 200%; } -.client-lobby-player-list { - @extend .row-list; - gap: 10px; +.game-start-role { + @extend .column-list; + text-align: center; + align-items: center; - &>* { - border: 1px solid white; - padding: 10px; - text-align: center; - - &:hover { - background-color: #fff; - color: #000; - } + &>button { + font-size: 1.5rem; + width: min(5cm, 30vw); } } + +.client-lobby-player-list { + @extend .column-list; + gap: 10px; + + &>button { + width: 90vw; + align-self: center; + $leave_color: rgba(255, 0, 0, 0.6); + color: $leave_color; + border: 1px solid $leave_color; + + &:hover { + background-color: $leave_color; + color: black; + } + + margin-bottom: 1cm; + } + + &>.list-actual { + @extend .row-list; + align-items: stretch; + align-content: stretch; + margin: 0; + + gap: 10px; + + width: 100%; + + &>* { + width: 4cm; + border: 1px solid white; + padding: 10px; + text-align: center; + + &:hover { + background-color: #fff; + color: #000; + } + } + } + +} diff --git a/werewolves/src/clients/client/client.rs b/werewolves/src/clients/client/client.rs index a51c5fd..09c2ab9 100644 --- a/werewolves/src/clients/client/client.rs +++ b/werewolves/src/clients/client/client.rs @@ -281,7 +281,11 @@ pub fn Client2(ClientProps { auto_join }: &ClientProps) -> Html { let connection = use_mut_ref(|| Connection2::new(client_state.setter(), ident.clone(), recv)); let content = match &*client_state { - ClientEvent2::Disconnected => html! {

{"disconnected"}

}, + ClientEvent2::Disconnected => html! { +
+

{"disconnected"}

+
+ }, ClientEvent2::Connecting => { if let Err(err) = connection .try_borrow_mut() @@ -307,7 +311,7 @@ pub fn Client2(ClientProps { auto_join }: &ClientProps) -> Html { html! {

{format!("Your role: {role_title}")}

- +
} } @@ -349,11 +353,11 @@ pub fn Client2(ClientProps { auto_join }: &ClientProps) -> Html { }; html! { -
+
{player}

{"there are currently "}{players.len()}{" players in the lobby"}

{button} -
+
{player_list}
diff --git a/werewolves/src/main.rs b/werewolves/src/main.rs index b2fee8d..86d08a3 100644 --- a/werewolves/src/main.rs +++ b/werewolves/src/main.rs @@ -59,7 +59,7 @@ fn main() { document.query_selector("app").unwrap().unwrap(), )] .into_iter() - .chain((2..17).map(|num| { + .chain((1..=2).map(|num| { ( PlayerId::from_u128(num as u128), format!("player {num}"),