From 9970a2275a56d7835ba0c12a8586dc25cf7ec1cf Mon Sep 17 00:00:00 2001 From: scratko Date: Sun, 18 Aug 2024 01:33:08 +0300 Subject: Global fixes v4.0 Removed unnecessary comments. Added resource cleanup for client and server. Changed queue display. Added player indicator. It's possible to quit the game while typing or waiting for a connection. Fixed a bug with determining the limit of card tossing. --- server/server.c | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) (limited to 'server/server.c') diff --git a/server/server.c b/server/server.c index f842a70..8ebc937 100644 --- a/server/server.c +++ b/server/server.c @@ -14,7 +14,6 @@ #include "card_stack.h" #include "card_queue.h" - static void init_session(struct session *new_session, struct sockaddr_in *from, int fd, int player_position) { @@ -62,12 +61,24 @@ static void close_connection(struct server *serv) if(!serv->sess_arr[i]) continue; serv->sess_arr[i]->state = disconnect; - send_disconnect_status(serv->sess_arr[i]->fd); - close(serv->sess_arr[i]->fd); + if(serv->sess_arr[i]->fd != -1) { + send_disconnect_status(serv->sess_arr[i]->fd); + close(serv->sess_arr[i]->fd); + } + clear_stack(&serv->sess_arr[i]->deck); free(serv->sess_arr[i]); serv->sess_arr[i] = NULL; } serv->connected_players_counter = 0; + free(serv->cc.number_arr); + free(serv->shuffled_deck); + free(serv->turn_queue); + free(serv->gi); + serv->cc.number_arr = NULL; + serv->shuffled_deck = NULL; + serv->turn_queue = NULL; + serv->gi = NULL; + clear_queue(&serv->cq); } static int check_playable_player_number(struct server *serv) @@ -93,10 +104,6 @@ static void init_new_game(struct server *serv) serv->trump_card = extract_trump_card(serv->shuffled_deck, &serv->shuffled_deck_size); serv->trump_suit = serv->trump_card + strlen(serv->trump_card) - 1; -#if 0 - serv->trump_suit = find_trump_suit(serv->shuffled_deck, - &serv->shuffled_deck_size); -#endif serv->turn_queue = malloc(sizeof(struct session*) * serv->connected_players_counter); serv->turn_queue_size = serv->connected_players_counter; @@ -354,7 +361,7 @@ static void define_phase_after_tossing(struct server *serv) } else { put_all_cards_from_queue_to_table(&serv->cot, &serv->cq); - if(is_receiving_cards_limit(&serv->cot, serv->turn_queue[1]->deck, + if(!is_receiving_cards_limit(&serv->cot, serv->turn_queue[1]->deck, &serv->cq) && check_someone_can_toss_card(serv->turn_queue, serv->turn_queue_size, @@ -383,7 +390,7 @@ static void define_phase_after_tossing(struct server *serv) } else { serv->turn_queue[1]->defense_lost = 1; put_all_cards_from_queue_to_table(&serv->cot, &serv->cq); - if(is_receiving_cards_limit(&serv->cot, + if(!is_receiving_cards_limit(&serv->cot, serv->turn_queue[1]->deck, &serv->cq) && check_someone_can_toss_card(serv->turn_queue, @@ -692,7 +699,7 @@ static int check_server_state_change_conditions(struct server *serv) static void make_data_transfer(struct server *serv, fd_set *readfds, fd_set *writefds) { - int i, result; + int i, result, close_connection_status = 0; for(i = 0; i < serv->max_sess_arr_size; ++i) { if(!serv->sess_arr[i]) continue; @@ -749,12 +756,12 @@ static void make_data_transfer(struct server *serv, fd_set *readfds, get_cards_from_tossing_player(serv->sess_arr[i], serv->turn_queue[1]->deck, &serv->cot, &serv->cq); - if(result == 1 || result == 2) + if(result == answer_got || result == anwer_got_with_limit) serv->sess_arr[i]->tm = answer_got; - if(result == 2) + if(result == anwer_got_with_limit) serv->tossing_limit = 1; - else if(result == 3) + else if(result == cancel) serv->sess_arr[i]->tm = cancel; } break; @@ -765,6 +772,12 @@ static void make_data_transfer(struct server *serv, fd_set *readfds, print_game_result(serv->sess_arr[i], serv->durak_position); break; } + if(!result) { + close(i); + serv->sess_arr[i]->fd = -1; + close_connection_status = 1; + result = 1; /* next can be reading that's not ready */ + } } if(serv->state == start_game || serv->state == table || serv->state == end_game) @@ -772,7 +785,7 @@ static void make_data_transfer(struct server *serv, fd_set *readfds, if(check_server_state_change_conditions(serv)) serv->change_server_state = 1; /* connection is closed */ - if(!result) { + if(close_connection_status) { close_connection(serv); serv->change_server_state = 0; serv->state = no_players; -- cgit v1.2.3