back to scratko.xyz
aboutsummaryrefslogtreecommitdiff
path: root/linux_client/verification_client_input.c
diff options
context:
space:
mode:
authorscratko <m@scratko.xyz>2024-08-30 12:46:56 +0300
committerscratko <m@scratko.xyz>2024-08-30 14:59:44 +0300
commit831f9f01fbe4088eb6bd378c0e417d9996b676fd (patch)
tree53297459d35ad795618c351a79b1829776e5e1f4 /linux_client/verification_client_input.c
parent4b6c15f780d59895f067383a5041edcfe86f504e (diff)
downloaddurak-831f9f01fbe4088eb6bd378c0e417d9996b676fd.tar.gz
durak-831f9f01fbe4088eb6bd378c0e417d9996b676fd.tar.bz2
durak-831f9f01fbe4088eb6bd378c0e417d9996b676fd.zip
Final version v2.0
Added windows client. SIGPIPE signal was being sent to the server when the client was disconnected. Now there is handling of this signal. Added a delay when displaying some informational messages.
Diffstat (limited to 'linux_client/verification_client_input.c')
-rw-r--r--linux_client/verification_client_input.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/linux_client/verification_client_input.c b/linux_client/verification_client_input.c
new file mode 100644
index 0000000..fa88b54
--- /dev/null
+++ b/linux_client/verification_client_input.c
@@ -0,0 +1,115 @@
+#include "verification_client_input.h"
+#include "card_handling.h"
+#include "printing_game_frames.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+
+enum {
+ output_buffer_size = 1024
+};
+
+static char output_buffer[output_buffer_size];
+
+/*
+ * 1 - response received
+ * 0 - waiting for re-entry of data
+ */
+int vci_confirmation_waiting(int fd, char *buffer)
+{
+ if(buffer[0] == '\n') {
+ write(fd, buffer, 1);
+ return 1;
+ }
+ else
+ printf("please press enter\n");
+ return 0;
+}
+
+/*
+ * example: A#\A^\Av\'\n'
+ * or (while tossing): '\n'
+ */
+int vci_attack_or_tossing(int fd, char *buffer, player_cards deck,
+ enum client_states state)
+{
+ int rank = 0, i, free_pos = 0;
+ char * card = NULL;
+
+ if(state == tossing && buffer[0] == '\n') { /* cancel card tossing */
+ write(fd, buffer, 1);
+ printf("skipping the card toss\n");
+ return 1;
+ }
+
+ 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;
+ }
+ }
+ /* 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'
+ */
+int vci_defense(int fd, char *buffer, player_cards deck)
+{
+ int last_idx;
+ char *card = NULL;
+
+ if(buffer[0] == '\n') { /* the player does not want to keep the defense */
+ write(fd, buffer, 1);
+ printf("accepting cards\n");
+ return 1;
+ }
+ if(buffer[1] != '\n') {
+ printf("incorrect input\n> ");
+ fflush(stdout);
+ return 0;
+ }
+ if((card = card_search_by_marked_letter(deck, buffer[0])) != NULL) {
+ strcpy(output_buffer, card);
+ last_idx = strlen(card);
+ output_buffer[last_idx] = '\n';
+ write(fd, output_buffer, last_idx+1);
+ return 1;
+ }
+ /* card is not found in the deck or cannot be used */
+ printf("incorrect input\n> ");
+ fflush(stdout);
+ return 0;
+}