From 4b2fdc91d42a438193d15840e10851c3847fbe80 Mon Sep 17 00:00:00 2001 From: scratko Date: Sat, 17 Aug 2024 02:42:19 +0300 Subject: Global fixes v3.0 Fixed bug when entering cards incorrectly. Added recognition of disconnection from the server. Added welcome screen and update screen. --- client/Makefile | 7 ++++- client/card_stack.c | 24 ++++++++++++++-- client/card_stack.h | 3 +- client/client.c | 24 +++++++++++++++- client/client.h | 3 +- client/printing_game_frames.c | 36 ++++++++++++++++++----- client/printing_game_frames.h | 5 +++- client/verification_client_input.c | 58 ++++++++++++++++++++++++-------------- 8 files changed, 125 insertions(+), 35 deletions(-) (limited to 'client') diff --git a/client/Makefile b/client/Makefile index eeae6c6..48e0d92 100644 --- a/client/Makefile +++ b/client/Makefile @@ -2,7 +2,7 @@ SRCMODULES = card_handling.c card_stack.c data_decryption.c\ printing_game_frames.c verification_client_input.c client.c OBJMODULES = $(SRCMODULES:.c=.o) CC = gcc -CFLAGS = -Wall -g -c +CFLAGS = -Wall -g -c -D DEBUG all: client @@ -12,7 +12,12 @@ all: client client: $(OBJMODULES) $(CC) $(LIBS) $^ -o $@ +ifneq (clean, $(MAKECMDGOALS)) -include deps.mk +endif deps.mk: $(SRCMODULES) $(CC) -MM $^ > $@ + +clean: + rm -f *.o client diff --git a/client/card_stack.c b/client/card_stack.c index d9dc273..6f0a673 100644 --- a/client/card_stack.c +++ b/client/card_stack.c @@ -101,6 +101,15 @@ static void mark_all_card_stack(player_cards deck) } } +static void clear_is_usable_status(player_cards deck) +{ + while(deck) { + if(deck->is_usable) + deck->is_usable = 0; + deck = deck->next; + } +} + void mark_card_for_attackers_stack(player_cards deck) { char *card = NULL, *found_card; @@ -108,6 +117,7 @@ void mark_card_for_attackers_stack(player_cards deck) int target_rank, found_rank; player_cards tmp_begin_deck = deck; + clear_is_usable_status(deck); while(deck) { /* is the card already marked? */ if(deck->is_usable) { @@ -204,8 +214,8 @@ void mark_card_for_tossing_stack(player_cards deck, struct cards_on_table *cot) deck = deck->next; } } -/* rename: and_unmarked */ -char* card_search_by_letter(player_cards deck, int letter) + +char* card_search_by_marked_letter(player_cards deck, int letter) { while(deck) { if(deck->tip == letter && deck->is_usable) { @@ -216,3 +226,13 @@ char* card_search_by_letter(player_cards deck, int letter) } return NULL; } + +char* card_search_by_unmarked_letter(player_cards deck, int letter) +{ + while(deck) { + if(deck->tip == letter) + return deck->str; + deck = deck->next; + } + return NULL; +} diff --git a/client/card_stack.h b/client/card_stack.h index ba973f4..0daf40a 100644 --- a/client/card_stack.h +++ b/client/card_stack.h @@ -24,6 +24,7 @@ void mark_card_for_defenders_stack(player_cards deck, struct cards_on_table *cot, char* trump_suit); void mark_card_for_tossing_stack(player_cards deck, struct cards_on_table *cot); -char* card_search_by_letter(player_cards deck, int letter); +char* card_search_by_marked_letter(player_cards deck, int letter); +char* card_search_by_unmarked_letter(player_cards deck, int letter); #endif diff --git a/client/client.c b/client/client.c index a5b3daf..5d49e1a 100644 --- a/client/client.c +++ b/client/client.c @@ -24,10 +24,15 @@ static void get_data_from_server(struct client *cl, fd_set *readfds) if(FD_ISSET(cl->fd, readfds)) { if(!cl->data_left_in_buffer) { cl->data_left_in_buffer = read(cl->fd, cl->buffer, max_buffer_size); + /* end of file -- closed connection */ + if(!cl->data_left_in_buffer) + exit(0); +#ifdef DEBUG printf("%d\n", cl->data_left_in_buffer); for(i = 0; i < cl->data_left_in_buffer; ++i) putchar(cl->buffer[i]); putchar('\n'); +#endif } decrypt_set_state(cl, &end_p); update_info = 1; @@ -69,6 +74,7 @@ static void get_data_from_server(struct client *cl, fd_set *readfds) break; /* no data to extract */ case tossing_limit_status: + case disconnect: default: {} } @@ -147,6 +153,9 @@ static void change_client_frame(struct client *cl) case result: pgf_game_result(cl->durak_position); break; + case disconnect: + pgf_disconnect(); + break; case none: {} } @@ -160,6 +169,11 @@ static void send_data_to_server(struct client *cl, fd_set *readfds) if(FD_ISSET(0, readfds)) { /* 0 - stdin */ read(0, cl->buffer, max_buffer_size); + if(cl->buffer[0] == 'q' && cl->buffer[1] == 'q') { + close(cl->fd); + exit(0); + } + switch(cl->state) { case confirmation_waiting: input_result = vci_confirmation_waiting(cl->fd, cl->buffer); @@ -274,8 +288,16 @@ int main() { struct client cl; + pgf_new_frame(); + pgf_welcome(); + sleep(2); init_client(&cl); - if(!connect_to_server(&cl)) + if(!connect_to_server(&cl)) { + pgf_new_frame(); + pgf_connection(0); return 1; + } + pgf_new_frame(); + pgf_connection(1); return main_loop(&cl); } diff --git a/client/client.h b/client/client.h index 1ff8f82..12ec619 100644 --- a/client/client.h +++ b/client/client.h @@ -25,7 +25,8 @@ enum client_states { card_acceptance_status, tossing_limit_status, spectator, - result + result, + disconnect }; enum spectator_mode { diff --git a/client/printing_game_frames.c b/client/printing_game_frames.c index 5c7deac..bda1208 100644 --- a/client/printing_game_frames.c +++ b/client/printing_game_frames.c @@ -11,6 +11,24 @@ void pgf_new_frame() printf("\n"); } +void pgf_welcome() +{ + printf("======================================================\n" + " Welcome!\n" + "You're playing siege durak/Podkidnoy (Throw-in) durak\n\n" + "If you have any questions, you can contact by email to\n" + " m@scratko.xyz\n" + "======================================================\n"); +} + +void pgf_connection(int status) +{ + if(status) + printf("Connection to the server has been successfully established\n"); + else + printf("Sorry, failed to connect to the server\n"); +} + void pgf_first_player() { printf("=======================================\n" @@ -23,7 +41,7 @@ void pgf_confirmation_waiting(int total_players) { printf("=======================================\n" " To start game press key \n" - "Connected players: %u/8 \n" + " Connected players: %u/8 \n" "=======================================\n", total_players); } @@ -71,8 +89,7 @@ void pgf_suggestions(struct client *cl) struct card_stack_item *deck = NULL; if(cl->state == attack || cl->state == tossing) - printf("you can specify more than one card " - "(under certain conditions)\n"); + printf("you can specify more than one card\n"); deck = cl->deck; while(deck) { if(deck->is_usable) @@ -129,8 +146,13 @@ void pgf_spectator_mode(enum spectator_mode sp_mode) void pgf_game_result(int durak_position) { - printf("===============================\n" - " END OF GAME\n" - "player under number %u is durak\n" - "===============================\n", durak_position); + printf("=======================================\n" + " END OF GAME\n" + " player number %u is durak\n" + "=======================================\n", durak_position); +} + +void pgf_disconnect() +{ + printf("Server connection disconnected\n"); } diff --git a/client/printing_game_frames.h b/client/printing_game_frames.h index cd72932..9cbb231 100644 --- a/client/printing_game_frames.h +++ b/client/printing_game_frames.h @@ -3,6 +3,9 @@ #include "client.h" +void pgf_new_frame(); +void pgf_welcome(); +void pgf_connection(int status); void pgf_first_player(); void pgf_confirmation_waiting(int total_players); void pgf_table(struct client *cl); @@ -12,6 +15,6 @@ void pgf_card_acceptance_status(int all_input_cards_accepted); void pgf_tossing_limit_status(); void pgf_spectator_mode(enum spectator_mode sp_mode); void pgf_game_result(int durak_position); -void pgf_new_frame(); +void pgf_disconnect(); #endif diff --git a/client/verification_client_input.c b/client/verification_client_input.c index 1530387..171cd64 100644 --- a/client/verification_client_input.c +++ b/client/verification_client_input.c @@ -1,5 +1,6 @@ #include "verification_client_input.h" #include "card_handling.h" +#include "printing_game_frames.h" #include #include @@ -33,7 +34,7 @@ int vci_confirmation_waiting(int fd, char *buffer) int vci_attack_or_tossing(int fd, char *buffer, player_cards deck, enum client_states state) { - int i, free_pos = 0; + int rank = 0, i, free_pos = 0; char * card = NULL; if(state == tossing && buffer[0] == '\n') { /* cancel card tossing */ @@ -41,31 +42,45 @@ int vci_attack_or_tossing(int fd, char *buffer, player_cards deck, return 1; } - for(i = 0; buffer[i] != '\n'; ++i) - if((card = card_search_by_letter(deck, buffer[i])) != NULL) { -#if 0 - if(!rank) - rank = convert_rank_to_int(card); - if(rank == convert_rank_to_int(card)) { -#endif - strncpy(output_buffer + free_pos, card, strlen(card)); - free_pos += strlen(card); - output_buffer[free_pos] = '\\'; - ++free_pos; -#if 0 - } else { - printf("incorrect input\n"); - return 0; + for(i = 0; buffer[i] != '\n'; ++i) { + /* some symbols */ + if(state == attack && buffer[1] != '\n') { + card = card_search_by_marked_letter(deck, buffer[i]); + if(card) { + if(!rank) + rank = convert_rank_to_int(card); + if(rank != convert_rank_to_int(card)) { + printf("incorrect input\n> "); + fflush(stdout); + return 0; + } } -#endif - } else { - printf("incorrect input\n"); + /* one symbol inputed? */ + } else if(state == attack && buffer[1] == '\n') + card = card_search_by_unmarked_letter(deck, buffer[i]); + else if(state == tossing) + card = card_search_by_marked_letter(deck, buffer[i]); + + if(!card) { + printf("incorrect input\n> "); + fflush(stdout); return 0; } + strncpy(output_buffer + free_pos, card, strlen(card)); + free_pos += strlen(card); + output_buffer[free_pos] = '\\'; + ++free_pos; + } + if(state == attack && buffer[0] == '\n') { + printf("incorrect input\n> "); + fflush(stdout); + return 0; + } output_buffer[free_pos] = '\n'; write(fd, output_buffer, free_pos+1); return 1; } + /* * example: 5v'\n' * or: '\n' @@ -80,10 +95,11 @@ int vci_defense(int fd, char *buffer, player_cards deck) return 1; } if(buffer[1] != '\n') { - printf("incorrect input\n"); + printf("incorrect input\n> "); + fflush(stdout); return 0; } - if((card = card_search_by_letter(deck, buffer[0])) != NULL) { + if((card = card_search_by_marked_letter(deck, buffer[0])) != NULL) { strcpy(output_buffer, card); last_idx = strlen(card); output_buffer[last_idx] = '\n'; -- cgit v1.2.3