fix: tie logic in KnockoutBracket
This commit is contained in:
@@ -507,6 +507,8 @@ impl Server {
|
||||
client.color = Color::None;
|
||||
drop(client);
|
||||
|
||||
self.matches.write().await.remove(¤t_match_id).unwrap();
|
||||
|
||||
let mut tournament_guard = self.tournament.write().await;
|
||||
let tourney = tournament_guard.as_mut().unwrap();
|
||||
tourney
|
||||
@@ -520,8 +522,6 @@ impl Server {
|
||||
)
|
||||
.await;
|
||||
drop(tournament_guard);
|
||||
|
||||
self.matches.write().await.remove(¤t_match_id).unwrap();
|
||||
}
|
||||
return Ok(());
|
||||
}
|
||||
@@ -588,6 +588,7 @@ impl Server {
|
||||
}
|
||||
|
||||
matches_guard.remove(¤t_match_id).unwrap();
|
||||
drop(matches_guard);
|
||||
|
||||
if self.tournament.read().await.is_some() {
|
||||
let mut tournament_guard = self.tournament.write().await;
|
||||
@@ -604,8 +605,7 @@ impl Server {
|
||||
.inform_winner(winner, current_match_id, player1.clone(), player2.clone())
|
||||
.await;
|
||||
|
||||
if matches_guard.is_empty() {
|
||||
drop(matches_guard);
|
||||
if self.matches.read().await.is_empty() {
|
||||
drop(clients_guard);
|
||||
|
||||
tourney.write().await.next(&self).await;
|
||||
@@ -744,12 +744,12 @@ impl Server {
|
||||
opponent.color = Color::None;
|
||||
drop(opponent);
|
||||
|
||||
matches.write().await.remove(&match_id).unwrap();
|
||||
|
||||
let mut tournament_guard = tournament.write().await;
|
||||
let tourney = tournament_guard.as_mut().unwrap();
|
||||
tourney.write().await.inform_winner(client_username, match_id, player1, player2).await;
|
||||
drop(tournament_guard);
|
||||
|
||||
matches.write().await.remove(&match_id).unwrap();
|
||||
}
|
||||
}
|
||||
}));
|
||||
|
||||
@@ -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 {
|
||||
winner = player2_track.0.clone();
|
||||
} else {
|
||||
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 {
|
||||
player1.color = Color::Yellow;
|
||||
let _ = send(&player1.connection, "GAME:START:0");
|
||||
for player in self.players.iter_mut() {
|
||||
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();
|
||||
|
||||
13
src/types.rs
13
src/types.rs
@@ -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) {
|
||||
for i in 0..6 {
|
||||
if self.board[column][i] == Color::None {
|
||||
|
||||
Reference in New Issue
Block a user