Do not take client input when it's not his turn
This commit is contained in:
parent
8d098c1ea4
commit
4c54d9b5e5
@ -5,6 +5,7 @@ use shakmaty::{fen, Chess, Color, Outcome, Position, Setup};
|
||||
use std::io;
|
||||
use std::os::unix::net::UnixStream;
|
||||
use std::sync::mpsc::{channel, Receiver, Sender};
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::thread;
|
||||
use std::time;
|
||||
use termion::event::{parse_event, Event, Key};
|
||||
@ -37,10 +38,14 @@ fn main() {
|
||||
}
|
||||
};
|
||||
|
||||
let is_player_turn = Arc::new(Mutex::new(true));
|
||||
let (display_sender, display_receiver) = channel();
|
||||
let (waiting_server_msg_sender, waiting_server_msg_receiver) = channel();
|
||||
let keyboard_input_recv =
|
||||
start_keyboard_input_thread(display_sender.clone(), waiting_server_msg_sender.clone());
|
||||
let keyboard_input_recv = start_keyboard_input_thread(
|
||||
display_sender.clone(),
|
||||
waiting_server_msg_sender.clone(),
|
||||
is_player_turn.clone(),
|
||||
);
|
||||
start_display_thread(display_receiver);
|
||||
//start a thread to listen to server messages
|
||||
let server_message_recv =
|
||||
@ -92,8 +97,12 @@ fn main() {
|
||||
let mut current_position = fetch_initial_chess_position(&client, &mut stream);
|
||||
|
||||
loop {
|
||||
let is_player_turn = clichess::is_player_turn(&client.player, current_position.turn());
|
||||
if is_player_turn || client.player.role == UserRole::Spectator {
|
||||
let is_player_turn_loop = clichess::is_player_turn(&client.player, current_position.turn());
|
||||
{
|
||||
let mut is_player_turn = is_player_turn.lock().unwrap();
|
||||
*is_player_turn = is_player_turn_loop;
|
||||
}
|
||||
if is_player_turn_loop || client.player.role == UserRole::Spectator {
|
||||
let mut message = String::from("");
|
||||
client
|
||||
.opponent_name
|
||||
@ -119,7 +128,7 @@ fn main() {
|
||||
if current_position.is_game_over() {
|
||||
break;
|
||||
}
|
||||
if is_player_turn {
|
||||
if is_player_turn_loop {
|
||||
//it's the user turn, taking user input
|
||||
let mut input = client.keyboard_input_recv.recv().unwrap();
|
||||
input = String::from(input.trim());
|
||||
@ -312,6 +321,7 @@ fn start_display_thread(request_recv: Receiver<DisplayMessage>) {
|
||||
fn start_keyboard_input_thread(
|
||||
display_sender: Sender<DisplayMessage>,
|
||||
waiting_server_msg_sender: Sender<WaitingServerMsg>,
|
||||
is_player_turn: Arc<Mutex<bool>>,
|
||||
) -> Receiver<String> {
|
||||
let (sender, receiver) = channel();
|
||||
thread::spawn(move || {
|
||||
@ -322,6 +332,11 @@ fn start_keyboard_input_thread(
|
||||
loop {
|
||||
let b = bytes.next().unwrap().unwrap();
|
||||
let e = parse_event(b, &mut bytes).unwrap();
|
||||
let is_player_turn = is_player_turn.lock().unwrap();
|
||||
if !*is_player_turn && e != Event::Key(Key::Ctrl('c')) {
|
||||
//ignore input when it's not the client turn
|
||||
continue;
|
||||
}
|
||||
match e {
|
||||
Event::Key(Key::Ctrl('c')) => {
|
||||
sender.send(String::from(EXIT_MSG)).unwrap();
|
||||
|
Loading…
Reference in New Issue
Block a user