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::io;
|
||||||
use std::os::unix::net::UnixStream;
|
use std::os::unix::net::UnixStream;
|
||||||
use std::sync::mpsc::{channel, Receiver, Sender};
|
use std::sync::mpsc::{channel, Receiver, Sender};
|
||||||
|
use std::sync::{Arc, Mutex};
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time;
|
use std::time;
|
||||||
use termion::event::{parse_event, Event, Key};
|
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 (display_sender, display_receiver) = channel();
|
||||||
let (waiting_server_msg_sender, waiting_server_msg_receiver) = channel();
|
let (waiting_server_msg_sender, waiting_server_msg_receiver) = channel();
|
||||||
let keyboard_input_recv =
|
let keyboard_input_recv = start_keyboard_input_thread(
|
||||||
start_keyboard_input_thread(display_sender.clone(), waiting_server_msg_sender.clone());
|
display_sender.clone(),
|
||||||
|
waiting_server_msg_sender.clone(),
|
||||||
|
is_player_turn.clone(),
|
||||||
|
);
|
||||||
start_display_thread(display_receiver);
|
start_display_thread(display_receiver);
|
||||||
//start a thread to listen to server messages
|
//start a thread to listen to server messages
|
||||||
let server_message_recv =
|
let server_message_recv =
|
||||||
@ -92,8 +97,12 @@ fn main() {
|
|||||||
let mut current_position = fetch_initial_chess_position(&client, &mut stream);
|
let mut current_position = fetch_initial_chess_position(&client, &mut stream);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let is_player_turn = clichess::is_player_turn(&client.player, current_position.turn());
|
let is_player_turn_loop = clichess::is_player_turn(&client.player, current_position.turn());
|
||||||
if is_player_turn || client.player.role == UserRole::Spectator {
|
{
|
||||||
|
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("");
|
let mut message = String::from("");
|
||||||
client
|
client
|
||||||
.opponent_name
|
.opponent_name
|
||||||
@ -119,7 +128,7 @@ fn main() {
|
|||||||
if current_position.is_game_over() {
|
if current_position.is_game_over() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if is_player_turn {
|
if is_player_turn_loop {
|
||||||
//it's the user turn, taking user input
|
//it's the user turn, taking user input
|
||||||
let mut input = client.keyboard_input_recv.recv().unwrap();
|
let mut input = client.keyboard_input_recv.recv().unwrap();
|
||||||
input = String::from(input.trim());
|
input = String::from(input.trim());
|
||||||
@ -312,6 +321,7 @@ fn start_display_thread(request_recv: Receiver<DisplayMessage>) {
|
|||||||
fn start_keyboard_input_thread(
|
fn start_keyboard_input_thread(
|
||||||
display_sender: Sender<DisplayMessage>,
|
display_sender: Sender<DisplayMessage>,
|
||||||
waiting_server_msg_sender: Sender<WaitingServerMsg>,
|
waiting_server_msg_sender: Sender<WaitingServerMsg>,
|
||||||
|
is_player_turn: Arc<Mutex<bool>>,
|
||||||
) -> Receiver<String> {
|
) -> Receiver<String> {
|
||||||
let (sender, receiver) = channel();
|
let (sender, receiver) = channel();
|
||||||
thread::spawn(move || {
|
thread::spawn(move || {
|
||||||
@ -322,6 +332,11 @@ fn start_keyboard_input_thread(
|
|||||||
loop {
|
loop {
|
||||||
let b = bytes.next().unwrap().unwrap();
|
let b = bytes.next().unwrap().unwrap();
|
||||||
let e = parse_event(b, &mut bytes).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 {
|
match e {
|
||||||
Event::Key(Key::Ctrl('c')) => {
|
Event::Key(Key::Ctrl('c')) => {
|
||||||
sender.send(String::from(EXIT_MSG)).unwrap();
|
sender.send(String::from(EXIT_MSG)).unwrap();
|
||||||
|
Loading…
Reference in New Issue
Block a user