From eb90648bdad1443c9cfc72e903a93642e10a0ab7 Mon Sep 17 00:00:00 2001 From: scratko Date: Fri, 16 Aug 2024 18:10:11 +0300 Subject: Global fixes v2.0 Added spectator mode. Added screen of game result. Added definition of durak. If not all players can replenish their decks, they take cards one at a time in turn. --- server/server_data_processing.c | 42 +++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) (limited to 'server/server_data_processing.c') diff --git a/server/server_data_processing.c b/server/server_data_processing.c index b7b2374..fc81996 100644 --- a/server/server_data_processing.c +++ b/server/server_data_processing.c @@ -63,7 +63,9 @@ int check_readiness(struct session *client) } /* * example: 10#\A^\7v'\n' - * or 0'\n' + * or: 10#\A^\7v: + * or: ='\n' + * or: =: */ static void copy_card_queue(int *offset, struct card_queue *cq) { @@ -84,7 +86,7 @@ static void copy_card_queue(int *offset, struct card_queue *cq) /* * example: 10#+\+Q#+A^+\+-+7v: - * or 0: + * or =: */ static void copy_cards_on_table(int *offset, struct cards_on_table cot) { @@ -102,8 +104,8 @@ static void copy_cards_on_table(int *offset, struct cards_on_table cot) /* * example: 10#\A^\7v: * or 10#\A^\7v'\n' - * or 0: - * or 0'\n' + * or =: + * or ='\n' */ static void copy_own_deck(int *offset, player_cards deck) { @@ -153,8 +155,10 @@ static void copy_base_info(int *free_pos, struct game_info *gi, *free_pos += sprintf(output_buffer + *free_pos, "=:"); } -int print_game_part(const struct session *client, struct game_info *gi) +int print_game_part(const struct session *client, + enum server_states ss, struct game_info *gi) { + enum spectator_mode sp_mode; int free_pos; /* free_pos == data length */ copy_base_info(&free_pos, gi, client->state, client->deck, @@ -181,6 +185,7 @@ int print_game_part(const struct session *client, struct game_info *gi) *(output_buffer + free_pos-1) = '\n'; break; case defense_expectation: + case spectator: /* copying whose turn */ free_pos += sprintf(output_buffer + free_pos, "%u:", gi->position_whose_turn); @@ -189,6 +194,17 @@ int print_game_part(const struct session *client, struct game_info *gi) free_pos += sprintf(output_buffer + free_pos, "=:"); else copy_card_queue(&free_pos, gi->cq); + if(client->state == spectator) { + if(ss == attack_phase_out) + sp_mode = spectator_attack; + else if(ss == defense_phase_out) + sp_mode = spectator_defense; + else if(ss == tossing_phase_out) + sp_mode = spectator_tossing; + else + sp_mode = spectator_table; + free_pos += sprintf(output_buffer + free_pos, "%u:", sp_mode); + } *(output_buffer + free_pos-1) = '\n'; default: {} @@ -315,6 +331,10 @@ int get_cards_from_tossing_player(struct session *client, if(!read_result) return read_result; + /* cancellation */ + if(client->buffer[0] == '\n') + return 3; + for(i = 0, j = 0; i < read_result; ++i) { if(client->buffer[i] == '\\') { /* tossing limit was set */ @@ -342,9 +362,6 @@ int get_cards_from_tossing_player(struct session *client, given_card[j] = client->buffer[i]; ++j; } - /* cancellation */ - if(client->buffer[0] == '\n') - return 3; /* 7 -- state for result of received cards */ data_length = sprintf(output_buffer, "%d:%s\n", card_acceptance_status, @@ -355,3 +372,12 @@ int get_cards_from_tossing_player(struct session *client, else return 2; } + +void print_game_result(const struct session *client, int durak_position) +{ + int data_size; + + data_size = + sprintf(output_buffer, "%u:%u\n", client->state, durak_position); + write_to_client(client->fd, data_size); +} -- cgit v1.2.3