fix: tie logic in KnockoutBracket

This commit is contained in:
2026-04-15 16:37:05 -04:00
Unverified
parent ad247b5765
commit f5f8e2bcdb
3 changed files with 92 additions and 71 deletions

View File

@@ -507,6 +507,8 @@ impl Server {
client.color = Color::None; client.color = Color::None;
drop(client); drop(client);
self.matches.write().await.remove(&current_match_id).unwrap();
let mut tournament_guard = self.tournament.write().await; let mut tournament_guard = self.tournament.write().await;
let tourney = tournament_guard.as_mut().unwrap(); let tourney = tournament_guard.as_mut().unwrap();
tourney tourney
@@ -520,8 +522,6 @@ impl Server {
) )
.await; .await;
drop(tournament_guard); drop(tournament_guard);
self.matches.write().await.remove(&current_match_id).unwrap();
} }
return Ok(()); return Ok(());
} }
@@ -588,6 +588,7 @@ impl Server {
} }
matches_guard.remove(&current_match_id).unwrap(); matches_guard.remove(&current_match_id).unwrap();
drop(matches_guard);
if self.tournament.read().await.is_some() { if self.tournament.read().await.is_some() {
let mut tournament_guard = self.tournament.write().await; let mut tournament_guard = self.tournament.write().await;
@@ -604,8 +605,7 @@ impl Server {
.inform_winner(winner, current_match_id, player1.clone(), player2.clone()) .inform_winner(winner, current_match_id, player1.clone(), player2.clone())
.await; .await;
if matches_guard.is_empty() { if self.matches.read().await.is_empty() {
drop(matches_guard);
drop(clients_guard); drop(clients_guard);
tourney.write().await.next(&self).await; tourney.write().await.next(&self).await;
@@ -744,12 +744,12 @@ impl Server {
opponent.color = Color::None; opponent.color = Color::None;
drop(opponent); drop(opponent);
matches.write().await.remove(&match_id).unwrap();
let mut tournament_guard = tournament.write().await; let mut tournament_guard = tournament.write().await;
let tourney = tournament_guard.as_mut().unwrap(); let tourney = tournament_guard.as_mut().unwrap();
tourney.write().await.inform_winner(client_username, match_id, player1, player2).await; tourney.write().await.inform_winner(client_username, match_id, player1, player2).await;
drop(tournament_guard); drop(tournament_guard);
matches.write().await.remove(&match_id).unwrap();
} }
} }
})); }));

View File

@@ -276,78 +276,86 @@ impl Tournament for KnockoutBracket {
} }
} }
if player1_track.2 { if player1_track.2 || player2_track.2 {
if player1_track.1 < player2_track.1 { if player1_track.1 < player2_track.1 {
winner = player2_track.0.clone(); winner = player2_track.0.clone();
} else { } else {
winner = player1_track.0.clone(); winner = player1_track.0.clone();
} }
}
let match_id: u32 = gen_match_id(&self.matches).await;
self.current_matches.push(match_id);
let new_match = Arc::new(RwLock::new(Match::new(
match_id,
player1.clone(),
player2.clone(),
false,
)));
let match_guard = new_match.read().await;
let clients_guard = self.clients.read().await;
let mut player1 = clients_guard.get(&player1).unwrap().write().await;
player1.current_match = Some(match_id);
player1.ready = false;
let player1_name = player1.username.clone();
if match_guard.player1 == player1.username {
player1.color = Color::Red;
let _ = send(&player1.connection, "GAME:START:1");
} else { } else {
player1.color = Color::Yellow; for player in self.players.iter_mut() {
let _ = send(&player1.connection, "GAME:START:0"); if player.0 == player1 || player.0 == player2 {
player.2 = true;
}
}
let new_match_id: u32 = gen_match_id(&self.matches).await;
self.current_matches.push(new_match_id);
let new_match = Arc::new(RwLock::new(Match::new_with_order(
new_match_id,
player2.clone(),
player1.clone(),
false,
)));
let match_guard = new_match.read().await;
let clients_guard = self.clients.read().await;
let mut player1 = clients_guard.get(&player1).unwrap().write().await;
player1.current_match = Some(new_match_id);
player1.ready = false;
let player1_name = player1.username.clone();
if match_guard.player1 == player1.username {
player1.color = Color::Red;
let _ = send(&player1.connection, "GAME:START:1");
} else {
player1.color = Color::Yellow;
let _ = send(&player1.connection, "GAME:START:0");
}
drop(player1);
let mut player2 = clients_guard.get(&player2).unwrap().write().await;
player2.current_match = Some(new_match_id);
player2.ready = false;
let player2_name = player2.username.clone();
if match_guard.player1 == player2.username {
player2.color = Color::Red;
let _ = send(&player2.connection, "GAME:START:1");
} else {
player2.color = Color::Yellow;
let _ = send(&player2.connection, "GAME:START:0");
}
drop(player2);
broadcast_message(
&self.observers,
&format!("READY:{}:{}", player1_name, false),
)
.await;
broadcast_message(
&self.observers,
&format!("READY:{}:{}", player2_name, false),
)
.await;
self.matches.write().await.insert(new_match_id, new_match.clone());
broadcast_message(
&self.observers,
&format!(
"GAME:START:{},{},{}",
new_match_id, match_guard.player1, match_guard.player2
),
)
.await;
self.current_matches.retain(|v| *v != match_id);
return;
} }
drop(player1);
let mut player2 = clients_guard.get(&player2).unwrap().write().await;
player2.current_match = Some(match_id);
player2.ready = false;
let player2_name = player2.username.clone();
if match_guard.player1 == player2.username {
player2.color = Color::Red;
let _ = send(&player2.connection, "GAME:START:1");
} else {
player2.color = Color::Yellow;
let _ = send(&player2.connection, "GAME:START:0");
}
drop(player2);
broadcast_message(
&self.observers,
&format!("READY:{}:{}", player1_name, false),
)
.await;
broadcast_message(
&self.observers,
&format!("READY:{}:{}", player2_name, false),
)
.await;
self.current_matches.push(match_id);
self.matches.write().await.insert(match_id, new_match.clone());
broadcast_message(
&self.observers,
&format!(
"GAME:START:{},{},{}",
match_id, match_guard.player1, match_guard.player2
),
)
.await;
} }
let mut loser = String::new(); let mut loser = String::new();

View File

@@ -88,6 +88,19 @@ impl Match {
} }
} }
pub fn new_with_order(id: u32, player1: String, player2: String, demo_mode: bool) -> Match {
Match {
id,
demo_mode,
board: vec![vec![Color::None; 6]; 7],
ledger: Vec::new(),
wait_thread: None,
timeout_thread: None,
player1,
player2,
}
}
pub fn place_token(&mut self, color: Color, column: usize) { pub fn place_token(&mut self, color: Color, column: usize) {
for i in 0..6 { for i in 0..6 {
if self.board[column][i] == Color::None { if self.board[column][i] == Color::None {