27 * |
27 * |
28 */ |
28 */ |
29 |
29 |
30 #include "terminal-chess.h" |
30 #include "terminal-chess.h" |
31 #include "input.h" |
31 #include "input.h" |
|
32 #include "game.h" |
32 #include <ncurses.h> |
33 #include <ncurses.h> |
33 |
34 |
34 int client_run(Settings *settings) { |
35 static int client_connect(Server *server, char *host, char *port) { |
35 Server server; |
36 if (net_find(server, host, port)) { |
36 int exit_code = EXIT_SUCCESS; |
|
37 |
|
38 if (net_find(&server, settings->serverhost, settings->port)) { |
|
39 fprintf(stderr, "Can't find server\n"); |
37 fprintf(stderr, "Can't find server\n"); |
40 exit_code = EXIT_FAILURE; |
38 return 1; |
41 goto quit; |
|
42 } |
39 } |
43 |
40 |
44 if (net_connect(&server)) { |
41 if (net_connect(server)) { |
45 perror("Can't connect to server"); |
42 perror("Can't connect to server"); |
46 exit_code = EXIT_FAILURE; |
43 return 1; |
47 goto quit; |
|
48 } |
44 } |
|
45 |
|
46 return 0; |
|
47 } |
49 |
48 |
50 /* net version handshake */ |
49 static int client_handshake(Server *server) { |
51 int fd = server.fd; |
50 if (net_recieve_code(server->fd) != NETCODE_VERSION) { |
52 if (net_recieve_code(fd) != NETCODE_VERSION) { |
|
53 fprintf(stderr, "Server uses an incompatible software version.\n"); |
51 fprintf(stderr, "Server uses an incompatible software version.\n"); |
54 exit_code = EXIT_FAILURE; |
52 return 1; |
55 goto quit; |
|
56 } else { |
53 } else { |
57 net_send_code(fd, NETCODE_VERSION); |
54 net_send_code(server->fd, NETCODE_VERSION); |
58 } |
55 } |
59 |
56 |
60 printw("Connection established!\n\n"); |
57 printw("Connection established!\n\n"); |
61 refresh(); |
58 refresh(); |
|
59 |
|
60 return 0; |
|
61 } |
62 |
62 |
63 if (net_recieve_code(fd) == NETCODE_GAMEINFO) { |
63 int client_run(Settings *settings) { |
64 net_recieve_data(fd, &(settings->gameinfo), |
64 Server server; |
|
65 |
|
66 if (client_connect(&server, settings->serverhost, settings->port)) { |
|
67 net_destroy(&server); |
|
68 return EXIT_FAILURE; |
|
69 } |
|
70 |
|
71 if (client_handshake(&server)) { |
|
72 net_destroy(&server); |
|
73 return EXIT_FAILURE; |
|
74 } |
|
75 |
|
76 if (net_recieve_code(server.fd) == NETCODE_GAMEINFO) { |
|
77 net_recieve_data(server.fd, &(settings->gameinfo), |
65 sizeof(settings->gameinfo)); |
78 sizeof(settings->gameinfo)); |
66 dump_gameinfo(&(settings->gameinfo)); |
79 dump_gameinfo(&(settings->gameinfo)); |
67 printw("Accept challenge (y/n)? "); |
80 printw("Accept challenge (y/n)? "); |
68 if (prompt_yesno()) { |
81 if (prompt_yesno()) { |
69 net_send_code(fd, NETCODE_ACCEPT); |
82 net_send_code(server.fd, NETCODE_ACCEPT); |
70 // TODO: start game |
83 game_start(settings, server.fd); |
71 } else { |
84 } else { |
72 net_send_code(fd, NETCODE_DECLINE); |
85 net_send_code(server.fd, NETCODE_DECLINE); |
73 } |
86 } |
74 } else { |
87 } else { |
75 fprintf(stderr, "Server sent invalid gameinfo.\n"); |
88 fprintf(stderr, "Server sent invalid gameinfo.\n"); |
76 exit_code = EXIT_FAILURE; |
89 net_destroy(&server); |
77 goto quit; |
90 return EXIT_FAILURE; |
78 } |
91 } |
79 |
92 |
80 quit: |
|
81 net_destroy(&server); |
93 net_destroy(&server); |
82 return exit_code; |
94 return EXIT_SUCCESS; |
83 } |
95 } |