From 880b8be2c28d761505b2eecc1386919d5add6f2f Mon Sep 17 00:00:00 2001 From: scratko Date: Wed, 14 Aug 2024 02:35:56 +0300 Subject: Global fixes v1.0 Defense hint now only takes into account unbeaten cards. The client accounts for sticky data in one packet via TCP. Changed delimiter when sending data related to cards on the table and the queue (from '0' to '='). Accepting cards from a client (verification_client_input.c) is heavily patched. Cards are taken from the stack at the hint's prompt. Added pop_stack(). The trump card is retrieved from the end of the array. Changed the check of the defender's ability to beat all cards. --- server/server.c | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) (limited to 'server/server.c') diff --git a/server/server.c b/server/server.c index 0a2bd0f..b2f1c3b 100644 --- a/server/server.c +++ b/server/server.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "server.h" #include "server_data_processing.h" @@ -34,6 +35,7 @@ static int accept_client(struct server *serv) struct session *new_session; socklen_t len = sizeof(addr); fd = accept(serv->listen_socket, (struct sockaddr*) &addr, &len); + setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (int[]){1}, sizeof(int)); if(fd == -1) return -1; @@ -395,6 +397,8 @@ static void determine_server_state(struct server *serv) case start_game: set_state_for_client(serv, attack); set_whose_turn(serv, attack); + update_game_info(serv->gi, serv->connected_players_counter, + serv->shuffled_deck_size, serv->position_whose_turn); set_record_status_for_all(serv); serv->state = attack_phase_out; break; @@ -418,6 +422,7 @@ static void determine_server_state(struct server *serv) break; case table: if(serv->turn_queue[1]->defense_lost) { + clear_defense_lost_status(serv->turn_queue[1]); move_all_cards_to_defender(&serv->cot, &serv->turn_queue[1]->deck); move_turn_queue_two_players_ahead(serv->turn_queue, serv->connected_players_counter); @@ -430,10 +435,18 @@ static void determine_server_state(struct server *serv) set_record_status_for_all(serv); set_state_for_client(serv, attack); set_whose_turn(serv, attack); + /* + * update the number of cards to determine how many cards + * a player still needs to add + */ update_card_quantity_arr(serv); deal_cards(serv->shuffled_deck, &serv->shuffled_deck_size, serv->turn_queue, serv->connected_players_counter, serv->cc.number_arr); + /* update the card count after giving out */ + update_card_quantity_arr(serv); + update_game_info(serv->gi, serv->connected_players_counter, + serv->shuffled_deck_size, serv->position_whose_turn); serv->state = attack_phase_out; break; case defense_phase_out: @@ -480,7 +493,7 @@ static int accept_new_player(struct server *serv) } static void set_up_player_tracking(struct server *serv, fd_set *readfds, - fd_set *writefds) + fd_set *writefds, int *maxfd) { int i; for(i = 0; i < serv->max_sess_arr_size; ++i) { @@ -489,11 +502,14 @@ static void set_up_player_tracking(struct server *serv, fd_set *readfds, switch(serv->state) { case first_player: - if(serv->sess_arr[i]->record) + if(serv->sess_arr[i]->record) { FD_SET(i, writefds); + *maxfd = i > *maxfd ? i : *maxfd; + } break; case confirmation_waiting: FD_SET(i, readfds); + *maxfd = i > *maxfd ? i : *maxfd; if(serv->sess_arr[i]->record) FD_SET(i, writefds); break; @@ -502,21 +518,30 @@ static void set_up_player_tracking(struct server *serv, fd_set *readfds, case table: case defense_phase_out: case tossing_phase_out: - if(serv->sess_arr[i]->record) + if(serv->sess_arr[i]->record) { FD_SET(i, writefds); + *maxfd = i > *maxfd ? i : *maxfd; + } break; case attack_phase_in: - if(serv->sess_arr[i]->state == attack) + if(serv->sess_arr[i]->state == attack) { FD_SET(i, readfds); + *maxfd = i > *maxfd ? i : *maxfd; + } break; case defense_phase_in: - if(serv->sess_arr[i]->state == defense) + if(serv->sess_arr[i]->state == defense) { FD_SET(i, readfds); + *maxfd = i > *maxfd ? i : *maxfd; + } break; case tossing_phase_in: if(serv->sess_arr[i]->state == tossing && serv->sess_arr[i]->tm == answer_wait) + { FD_SET(i, readfds); + *maxfd = i > *maxfd ? i : *maxfd; + } break; case no_players: {} @@ -646,7 +671,7 @@ int main_loop(struct server *serv) maxfd = serv->listen_socket; } - set_up_player_tracking(serv, &readfds, &writefds); + set_up_player_tracking(serv, &readfds, &writefds, &maxfd); select_result = select(maxfd + 1, &readfds, &writefds, NULL, NULL); if(select_result == -1) @@ -677,7 +702,6 @@ static int init_server(struct server *serv, int port) opt = 1; setsockopt(serv->listen_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); - addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(port); -- cgit v1.2.3