role ack fix

This commit is contained in:
emilis 2025-10-02 20:19:55 +01:00
parent c96e019071
commit 242691a05f
No known key found for this signature in database
4 changed files with 132 additions and 17 deletions

View File

@ -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:

View File

@ -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;
}
}
}
}

View File

@ -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! {<p>{"disconnected"}</p>},
ClientEvent2::Disconnected => html! {
<div class="column-list">
<p>{"disconnected"}</p>
</div>
},
ClientEvent2::Connecting => {
if let Err(err) = connection
.try_borrow_mut()
@ -307,7 +311,7 @@ pub fn Client2(ClientProps { auto_join }: &ClientProps) -> Html {
html! {
<div class="game-start-role">
<p>{format!("Your role: {role_title}")}</p>
<button onclick={on_click}>{"got it"}</button>
<Button on_click={on_click}>{"got it"}</Button>
</div>
}
}
@ -349,11 +353,11 @@ pub fn Client2(ClientProps { auto_join }: &ClientProps) -> Html {
};
html! {
<div class="column-list gap">
<div class="client-lobby-player-list">
{player}
<h2>{"there are currently "}{players.len()}{" players in the lobby"}</h2>
{button}
<div class="client-lobby-player-list">
<div class="list-actual">
{player_list}
</div>
</div>

View File

@ -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}"),