src/main.c

Thu, 28 May 2026 12:15:26 +0200

author
Mike Becker <universe@uap-core.de>
date
Thu, 28 May 2026 12:15:26 +0200
changeset 129
189c7c77aaab
parent 94
864f59271974
child 130
3fc6b1d6cbe9
permissions
-rw-r--r--

simplify code structure

0
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
55
54ea19938d57 updated copyright and version info
Mike Becker <universe@uap-core.de>
parents: 52
diff changeset
4 * Copyright 2016 Mike Becker. All rights reserved.
0
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 *
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 */
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29
92
84e0dec5db16 use port number instead of port string in network code
Mike Becker <universe@uap-core.de>
parents: 90
diff changeset
30 #define PROGRAM_VERSION "1.0 alpha"
78
ceb9197b3c6d improve code structure
Mike Becker <universe@uap-core.de>
parents: 75
diff changeset
31
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
32 #include "chess/rules.h"
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
33 #include "chess/pgn.h"
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 5
diff changeset
34 #include "input.h"
78
ceb9197b3c6d improve code structure
Mike Becker <universe@uap-core.de>
parents: 75
diff changeset
35 #include "network.h"
35
6c64b7a073af tried to improve colors
Mike Becker <universe@uap-core.de>
parents: 34
diff changeset
36 #include "colors.h"
1
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
37 #include <string.h>
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
38 #include <time.h>
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 5
diff changeset
39 #include <getopt.h>
69
c8f2c280cff7 adds unicode support
Mike Becker <universe@uap-core.de>
parents: 55
diff changeset
40 #include <locale.h>
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
41 #include <sys/stat.h>
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
42 #include <signal.h>
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
43 #include <errno.h>
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
44 #include <unistd.h>
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
45
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
46 typedef struct {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
47 GameInfo gameinfo;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
48 /**
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
49 * Server host address.
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
50 * TCP: server address or \c NULL when we are the server
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
51 * Domain Socket: the path to the domain socket
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
52 */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
53 char* serverhost;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
54 char* continuepgn;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
55 short port;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
56 bool ishost;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
57 bool usedomainsocket;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
58 bool singlemachine;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
59 bool disableflip;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
60 bool unicode;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
61 } Settings;
1
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
62
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
63 int get_settings(int argc, char **argv, Settings *settings) {
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
64 char *valid;
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
65 unsigned long int time, port;
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
66 uint8_t timeunit = 60;
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
67 size_t len;
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
68 bool port_set = false;
1
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
69
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
70 for (int opt ; (opt = getopt(argc, argv, "a:bc:Fhp:rsS:t:uUv")) != -1 ;) {
1
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
71 switch (opt) {
47
d726e4b46c33 refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
72 case 'c':
d726e4b46c33 refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
73 settings->continuepgn = optarg;
d726e4b46c33 refactoring of getlocation mechanism for better short algebraic notation support (does now respect pinned pieces) + fixed a bug where a pawn could advance through a piece (e.g. e2e4 could jump over a piece on e3)
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
74 break;
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
75 case 'b':
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
76 settings->gameinfo.servercolor = BLACK;
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
77 break;
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
78 case 'r':
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 5
diff changeset
79 settings->gameinfo.servercolor = rand() & 1 ? WHITE : BLACK;
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
80 break;
26
e0a76ee1bb2b introduced single machine mode
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
81 case 's':
90
395542d915d7 add option that disables board flip in solo games
Mike Becker <universe@uap-core.de>
parents: 89
diff changeset
82 settings->singlemachine = true;
395542d915d7 add option that disables board flip in solo games
Mike Becker <universe@uap-core.de>
parents: 89
diff changeset
83 break;
395542d915d7 add option that disables board flip in solo games
Mike Becker <universe@uap-core.de>
parents: 89
diff changeset
84 case 'F':
395542d915d7 add option that disables board flip in solo games
Mike Becker <universe@uap-core.de>
parents: 89
diff changeset
85 settings->disableflip = true;
26
e0a76ee1bb2b introduced single machine mode
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
86 break;
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
87 case 'u':
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
88 if (port_set) {
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
89 fprintf(stderr, "Cannot use Unix domain sockets "
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
90 "when a TCP port was specified.\n");
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
91 return 1;
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
92 }
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
93 settings->usedomainsocket = true;
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
94 break;
69
c8f2c280cff7 adds unicode support
Mike Becker <universe@uap-core.de>
parents: 55
diff changeset
95 case 'U':
90
395542d915d7 add option that disables board flip in solo games
Mike Becker <universe@uap-core.de>
parents: 89
diff changeset
96 settings->unicode = false;
69
c8f2c280cff7 adds unicode support
Mike Becker <universe@uap-core.de>
parents: 55
diff changeset
97 break;
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
98 case 't':
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
99 case 'a':
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
100 len = strlen(optarg);
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
101 if (optarg[len-1] == 's') {
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
102 optarg[len-1] = '\0';
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
103 timeunit = 1;
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
104 }
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
105
30
a285ee393860 experimental async input for single machine mode
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
106 if ((time = strtoul(optarg, &valid, 10))*timeunit > UINT16_MAX
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
107 || *valid != '\0') {
30
a285ee393860 experimental async input for single machine mode
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
108 fprintf(stderr, "Specified time is invalid (%s)"
a285ee393860 experimental async input for single machine mode
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
109 "- Maximum: 65535 seconds (1092 minutes)\n", optarg);
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
110 return 1;
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
111 } else {
30
a285ee393860 experimental async input for single machine mode
Mike Becker <universe@uap-core.de>
parents: 29
diff changeset
112 settings->gameinfo.timecontrol = 1;
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
113 if (opt=='t') {
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
114 settings->gameinfo.time = timeunit * time;
1
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
115 } else {
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
116 settings->gameinfo.addtime = time;
1
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
117 }
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
118 }
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
119 break;
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
120 case 'p':
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
121 if (port_set) {
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
122 fprintf(stderr, "Cannot use -p twice.\n");
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
123 return 1;
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
124 }
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
125 if (settings->usedomainsocket) {
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
126 fprintf(stderr, "Cannot specify TCP port "
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
127 "when using Unix domain sockets.\n");
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
128 return 1;
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
129 }
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
130 port = strtol(optarg, &valid, 10);
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
131 if (port < 1025 || port > 65535 || *valid != '\0') {
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
132 fprintf(stderr,
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
133 "Invalid port number (%s) - choose a number between "
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
134 "1025 and 65535\n",
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
135 optarg);
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
136 return 1;
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
137 } else {
92
84e0dec5db16 use port number instead of port string in network code
Mike Becker <universe@uap-core.de>
parents: 90
diff changeset
138 settings->port = (short) port;
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
139 port_set = true;
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
140 }
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
141 break;
52
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
142 case 'v':
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
143 printf("terminal-chess : Version %s (Netcode Version %d)\n",
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
144 PROGRAM_VERSION, NETCODE_VERSION);
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
145 exit(0);
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
146 case 'h':
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
147 case '?':
52
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
148 printf(
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
149 "Usage: terminal-chess [OPTION]... [HOST]\n"
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
150 "Starts/joins a network chess game\n"
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
151 "\nGeneral options\n"
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
152 " -c <PGN file> Continue the specified game\n"
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
153 " -h This help page\n"
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
154 " -p TCP port to use (default: 27015)\n"
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
155 " -u Use Unix domain socket instead of TCP\n"
84
df47b7efb97d disabling Unicode pieces is a general option
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
156 " -U Disables unicode pieces\n"
75
b0b8bf3c536e fix typo in help text
Mike Becker <universe@uap-core.de>
parents: 69
diff changeset
157 " -v Print version information and exits\n"
52
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
158 "\nServer options\n"
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
159 " -a <time> Specifies the time to add after each move\n"
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
160 " -b Server plays black pieces (default: white)\n"
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
161 " -r Distribute color randomly\n"
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
162 " -t <time> Specifies time limit (default: no limit)\n"
90
395542d915d7 add option that disables board flip in solo games
Mike Becker <universe@uap-core.de>
parents: 89
diff changeset
163 "\nHot seat\n"
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
164 " -s Play a hot seat game (network options are ignored)\n"
90
395542d915d7 add option that disables board flip in solo games
Mike Becker <universe@uap-core.de>
parents: 89
diff changeset
165 " -F Do not automatically flip the board in hot seat games\n"
52
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
166 "\nNotes\n"
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
167 "The time unit for -a is seconds and for -t minutes by default. To "
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
168 "specify\nseconds for the -t option, use the s suffix.\n"
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
169 "Example: -t 150s\n\n"
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
170 "Use '-' for PGN files to read PGN data from standard input\n\n"
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
171 "When playing over Unix domain socket, the HOST denotes the socket path.\n"
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
172 "When the path doest not exist, a game is created. Otherwise, the program\n"
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
173 "joins the existing game. When HOST is omitted, /tmp/chess.sock is used.\n"
52
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
174 );
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
175 exit(0);
1
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
176 }
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
177 }
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
178
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
179 if (optind == argc - 1) {
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
180 settings->serverhost = argv[optind];
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
181 } else if (optind < argc - 1) {
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
182 fprintf(stderr, "Too many arguments\n");
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
183 return 1;
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
184 }
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
185
50
41017d0a72c5 added pgn parser and writer (without comment support yet) + minor refactorings
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
186
41017d0a72c5 added pgn parser and writer (without comment support yet) + minor refactorings
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
187 if (settings->continuepgn) {
41017d0a72c5 added pgn parser and writer (without comment support yet) + minor refactorings
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
188 if (settings->serverhost) {
41017d0a72c5 added pgn parser and writer (without comment support yet) + minor refactorings
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
189 fprintf(stderr, "Can't continue a game when joining a server.\n");
41017d0a72c5 added pgn parser and writer (without comment support yet) + minor refactorings
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
190 return 1;
41017d0a72c5 added pgn parser and writer (without comment support yet) + minor refactorings
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
191 }
41017d0a72c5 added pgn parser and writer (without comment support yet) + minor refactorings
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
192 }
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
193
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
194 if (settings->usedomainsocket) {
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
195 if (!settings->serverhost) {
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
196 settings->serverhost = "/tmp/chess.sock";
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
197 }
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
198 struct stat st;
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
199 if (stat(settings->serverhost, &st) == 0) {
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
200 if (S_ISSOCK(st.st_mode)) {
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
201 settings->ishost = false;
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
202 } else {
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
203 fprintf(stderr, "%s is not a Unix domain socket.\n",
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
204 settings->serverhost);
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
205 return 1;
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
206 }
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
207 } else {
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
208 settings->ishost = true;
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
209 }
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
210 } else {
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
211 settings->ishost = !settings->serverhost;
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
212 }
50
41017d0a72c5 added pgn parser and writer (without comment support yet) + minor refactorings
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
213
1
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
214 return 0;
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
215 }
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
216
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
217 static Settings settings;
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
218
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
219 static void init_settings(void) {
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
220 memset(&settings, 0, sizeof(settings));
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
221 settings.gameinfo.servercolor = WHITE;
92
84e0dec5db16 use port number instead of port string in network code
Mike Becker <universe@uap-core.de>
parents: 90
diff changeset
222 settings.port = 27015;
69
c8f2c280cff7 adds unicode support
Mike Becker <universe@uap-core.de>
parents: 55
diff changeset
223 settings.unicode = !!setlocale(LC_CTYPE, "C.UTF-8");
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
224 }
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
225
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
226 static void cleanup() {
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
227 endwin();
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
228 if (settings.usedomainsocket && settings.ishost) {
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
229 remove(settings.serverhost);
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
230 }
1
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
231 }
e5fbb8f9edbe added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
232
129
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
233 static const uint8_t boardx = 4, boardy = 10;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
234 static int inputy = 21; /* should be overridden on game startup */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
235
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
236 static int timecontrol(GameState *gamestate, GameInfo *gameinfo) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
237 if (gameinfo->timecontrol) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
238 uint16_t white = remaining_movetime(gameinfo, gamestate, WHITE);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
239 uint16_t black = remaining_movetime(gameinfo, gamestate, BLACK);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
240 char clkstr[16];
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
241 bool always_hours = gameinfo->time >= 3600;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
242 print_clk(white, clkstr, always_hours);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
243 mvprintw(boardy+4, boardx-1, "White time: %s", clkstr);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
244 print_clk(black, clkstr, always_hours);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
245 mvprintw(boardy+5, boardx-1, "Black time: %s", clkstr);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
246
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
247 if (white == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
248 move(inputy, 0);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
249 printw("Time is over - Black wins!");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
250 clrtobot();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
251 refresh();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
252 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
253 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
254 if (black == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
255 move(inputy, 0);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
256 printw("Time is over - White wins!");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
257 clrtobot();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
258 refresh();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
259 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
260 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
261 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
262
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
263 return 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
264 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
265
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
266 static void draw_board(GameState *gamestate,
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
267 uint8_t perspective,
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
268 bool unicode) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
269 char fen[90];
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
270 compute_fen(fen, gamestate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
271 mvaddstr(0, 0, fen);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
272
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
273 for (uint8_t y = 0 ; y < 8 ; y++) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
274 for (uint8_t x = 0 ; x < 8 ; x++) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
275 uint8_t col = gamestate->board[y][x] & COLOR_MASK;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
276 uint8_t piece = gamestate->board[y][x];
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
277 char piecestr[5];
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
278 if (piece) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
279 if (unicode) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
280 char* uc = getpieceunicode(piece);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
281 strncpy(piecestr, uc, 5);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
282 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
283 piecestr[0] = (piece & PIECE_MASK) == PAWN
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
284 ? 'P' : getpiecechr(piece);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
285 piecestr[1] = '\0';
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
286 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
287 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
288 piecestr[0] = ' ';
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
289 piecestr[1] = '\0';
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
290 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
291
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
292 bool boardblack = (y&1)==(x&1);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
293 attrset((col==WHITE ? A_BOLD : A_DIM)|
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
294 COLOR_PAIR(col == WHITE ?
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
295 (boardblack ? COL_WB : COL_WW) :
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
296 (boardblack ? COL_BB : COL_BW)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
297 )
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
298 );
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
299
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
300 int cy = perspective == WHITE ? boardy-y : boardy-7+y;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
301 int cx = perspective == WHITE ? boardx+x*3 : boardx+21-x*3;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
302 mvprintw(cy, cx, " %s ", piecestr);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
303 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
304 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
305
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
306 attrset(A_NORMAL);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
307 for (uint8_t i = 0 ; i < 8 ; i++) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
308 int x = perspective == WHITE ? boardx+i*3+1 : boardx+22-i*3;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
309 int y = perspective == WHITE ? boardy-i : boardy-7+i;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
310 mvaddch(boardy+1, x, 'a'+i);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
311 mvaddch(y, boardx-2, '1'+i);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
312 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
313
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
314 /* move log */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
315 uint8_t logy = 2;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
316 const uint8_t logx = boardx + 28;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
317 move(logy, logx);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
318
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
319 /* count full moves */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
320 unsigned int logi = 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
321
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
322 /* wrap log after 45 moves */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
323 while (gamestate->movecount/6-logi/3 >= 15) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
324 logi++;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
325 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
326
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
327 for (unsigned mi = logi*2 ; mi < gamestate->movecount ; mi++) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
328 bool iswhite = mi % 2 == 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
329 if (iswhite) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
330 logi++;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
331 printw("%d. ", logi);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
332 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
333
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
334 addstr(gamestate->moves[mi].string);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
335 if (!iswhite && logi%3 == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
336 move(++logy, logx);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
337 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
338 addch(' ');
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
339 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
340 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
341 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
342
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
343 static void eval_move_failed_msg(int code) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
344 switch (code) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
345 case AMBIGUOUS_MOVE:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
346 printw("Ambiguous move - please specify the piece to move.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
347 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
348 case INVALID_POSITION:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
349 printw("No piece can be moved this way.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
350 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
351 case NEED_PROMOTION:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
352 printw("You need to promote the pawn (append \"=Q\" e.g.)!");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
353 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
354 case KING_IN_CHECK:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
355 printw("Your king is in check!");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
356 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
357 case PIECE_PINNED:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
358 printw("This piece is pinned!");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
359 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
360 case INVALID_MOVE_SYNTAX:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
361 printw("Can't interpret move - please use algebraic notation.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
362 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
363 case RULES_VIOLATED:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
364 printw("Move does not comply chess rules.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
365 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
366 case KING_MOVES_INTO_CHECK:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
367 printw("Can't move the king into a check position.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
368 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
369 default:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
370 printw("Unknown move parser error.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
371 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
372 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
373
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
374 static void save_pgn(GameState *gamestate, GameInfo *gameinfo) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
375 int y = getcury(stdscr);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
376
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
377 /* ask for player names */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
378 {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
379 char pname[PLAYER_NAME_BUFLEN];
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
380 printw("\rWhite's name (%s): ", pgn_player_name(gamestate, WHITE));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
381 clrtoeol();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
382 if (getnstr(pname, PLAYER_NAME_BUFLEN) == OK && pname[0] != '\0') {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
383 strncpy(gamestate->wname, pname, PLAYER_NAME_BUFLEN);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
384 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
385 move(y, 0);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
386 printw("\rBlack's name (%s): ", pgn_player_name(gamestate, BLACK));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
387 clrtoeol();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
388 if (getnstr(pname, PLAYER_NAME_BUFLEN) == OK && pname[0] != '\0') {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
389 strncpy(gamestate->bname, pname, PLAYER_NAME_BUFLEN);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
390 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
391 move(y, 0);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
392 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
393
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
394 bool export_comments = prompt_yesno("Export with comments");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
395
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
396 printw("\rFilename: ");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
397 clrtoeol();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
398
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
399 char filename[64];
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
400 if (getnstr(filename, 64) == OK && filename[0] != '\0') {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
401 move(y, 0);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
402 FILE *file = fopen(filename, "w");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
403 if (file) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
404 write_pgn(file, gamestate, gameinfo, export_comments);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
405 fclose(file);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
406 printw("File saved.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
407 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
408 printw("Can't write to file (%s).", strerror(errno));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
409 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
410 clrtoeol();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
411 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
412 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
413
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
414 #define MOVESTR_BUFLEN 10
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
415 static int domove_singlemachine(GameState *gamestate,
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
416 GameInfo *gameinfo, uint8_t curcolor) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
417
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
418
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
419 size_t bufpos = 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
420 char movestr[MOVESTR_BUFLEN];
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
421
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
422 flushinp();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
423 while (1) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
424 const char *curcolorstr = curcolor == WHITE ? "White" : "Black";
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
425 if (timecontrol(gamestate, gameinfo)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
426 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
427 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
428 move(inputy, 0);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
429 printw(
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
430 "Use chess notation to enter your move.\n"
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
431 "Or use a command: remis, resign, savepgn\n\n"
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
432 "%s to move: ", curcolorstr);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
433 clrtoeol();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
434
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
435 if (asyncgetnstr(movestr, &bufpos, MOVESTR_BUFLEN)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
436 if (strncmp(movestr, "resign", MOVESTR_BUFLEN) == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
437 if (curcolor == WHITE) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
438 gamestate->wresign = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
439 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
440 gamestate->bresign = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
441 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
442 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
443 } else if (strncmp(movestr, "remis", MOVESTR_BUFLEN) == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
444 gamestate->remis = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
445 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
446 } else if (strncmp(movestr, "savepgn", MOVESTR_BUFLEN) == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
447 save_pgn(gamestate, gameinfo);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
448 } else if (movestr[0] == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
449 /* ignore empty move strings and ask again */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
450 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
451 Move move;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
452 int result = eval_move(gamestate, movestr, &move, curcolor);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
453 if (result == VALID_MOVE_SYNTAX) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
454 result = validate_move(gamestate, &move);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
455 if (result == VALID_MOVE_SEMANTICS) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
456 apply_move(gamestate, &move);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
457 if (gamestate->checkmate) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
458 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
459 } else if (gamestate->stalemate) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
460 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
461 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
462 return 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
463 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
464 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
465 eval_move_failed_msg(result);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
466 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
467 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
468 eval_move_failed_msg(result);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
469 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
470 clrtoeol();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
471 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
472 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
473 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
474 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
475
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
476 static int sendmove(GameState *gamestate, GameInfo *gameinfo,
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
477 int opponent, uint8_t mycolor) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
478
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
479 size_t bufpos = 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
480 char movestr[MOVESTR_BUFLEN];
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
481 bool remis_rejected = false;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
482 bool remis_suggested = false;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
483 bool resign_suggested = false;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
484 bool use_premove = false;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
485 uint8_t code;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
486
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
487 if (*gamestate->premove) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
488 use_premove = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
489 const unsigned mlen = sizeof(gamestate->premove);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
490 strncpy(movestr, gamestate->premove, mlen);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
491 movestr[mlen] = '\0';
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
492 memset(gamestate->premove, 0, mlen);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
493 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
494
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
495 flushinp();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
496 while (1) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
497 if (timecontrol(gamestate, gameinfo)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
498 net_send_code(opponent, NETCODE_TIMEOVER);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
499 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
500 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
501
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
502 move(inputy, 0);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
503 printw("Use chess notation to enter your move.\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
504 if (resign_suggested) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
505 if (remis_suggested) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
506 printw("The opponent asks you to resign or accept remis. \n\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
507 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
508 printw("The opponent asks you to resign. \n\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
509 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
510 } else if (remis_suggested) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
511 printw("The opponent offers remis. Type remis to accept. \n\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
512 } else if (remis_rejected) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
513 printw("Remis offer rejected. \n\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
514 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
515 printw("Or use a command: remis, resign, savepgn \n\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
516 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
517 printw("Type your move: ");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
518 clrtoeol();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
519
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
520 /* check if the opponent sent us something */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
521 code = net_recieve_code_async(opponent);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
522 switch (code) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
523 case NETCODE_REMIS:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
524 remis_suggested = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
525 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
526 case NETCODE_TAUNT:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
527 resign_suggested = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
528 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
529 case NETCODE_RESIGN:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
530 if (mycolor == WHITE) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
531 gamestate->bresign = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
532 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
533 gamestate->wresign = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
534 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
535 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
536 case NETCODE_CONNLOST:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
537 gamestate->ragequit = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
538 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
539 case NETCODE_ERROR:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
540 printw("\rCannot perform asynchronous network IO");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
541 cbreak(); getch();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
542 exit(EXIT_FAILURE);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
543 case NETCODE_AGAIN:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
544 /* try again */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
545 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
546 default:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
547 printw("\nThe opponent sent an invalid network pacakge.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
548 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
549
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
550 /* read move */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
551 if (use_premove || asyncgetnstr(movestr, &bufpos, MOVESTR_BUFLEN)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
552 bool was_premove = use_premove;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
553 use_premove = false;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
554 if (strncmp(movestr, "resign", MOVESTR_BUFLEN) == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
555 if (mycolor == WHITE) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
556 gamestate->wresign = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
557 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
558 gamestate->bresign = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
559 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
560 net_send_code(opponent, NETCODE_RESIGN);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
561 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
562 } else if (strncmp(movestr, "savepgn", MOVESTR_BUFLEN) == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
563 save_pgn(gamestate, gameinfo);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
564 } else if (strncmp(movestr, "remis", MOVESTR_BUFLEN) == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
565 if (remis_suggested) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
566 net_send_code(opponent, NETCODE_REMIS);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
567 gamestate->remis = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
568 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
569 } if (!remis_rejected) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
570 net_send_code(opponent, NETCODE_REMIS);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
571 printw("Remis offer sent - waiting for acceptance...");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
572 refresh();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
573 code = net_recieve_code(opponent);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
574 if (code == NETCODE_ACCEPT) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
575 gamestate->remis = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
576 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
577 } else if (code == NETCODE_CONNLOST) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
578 gamestate->ragequit = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
579 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
580 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
581 remis_rejected = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
582 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
583 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
584 } else if (movestr[0] == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
585 /* ignore empty move strings and ask again */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
586 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
587 Move move;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
588 int eval_result = eval_move(gamestate, movestr, &move, mycolor);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
589 switch (eval_result) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
590 case VALID_MOVE_SYNTAX:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
591 net_send_data(opponent, NETCODE_MOVE, &move, sizeof(Move));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
592 code = net_recieve_code(opponent);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
593 move.check = code == NETCODE_CHECK ||
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
594 code == NETCODE_CHECKMATE;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
595 gamestate->checkmate = code == NETCODE_CHECKMATE;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
596 gamestate->stalemate = code == NETCODE_STALEMATE;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
597 if (code == NETCODE_DECLINE) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
598 uint32_t reason;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
599 net_recieve_data(opponent, &reason, sizeof(uint32_t));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
600 reason = ntohl(reason);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
601 eval_move_failed_msg(reason);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
602 } else if (code == NETCODE_ACCEPT
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
603 || code == NETCODE_CHECK
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
604 || code == NETCODE_CHECKMATE
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
605 || code == NETCODE_STALEMATE) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
606 apply_move(gamestate, &move);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
607 if (gamestate->checkmate || gamestate->stalemate) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
608 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
609 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
610 return 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
611 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
612 } else if (code == NETCODE_CONNLOST) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
613 printw("Your opponent left the game.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
614 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
615 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
616 printw("Invalid network response.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
617 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
618 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
619 default:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
620 if (was_premove) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
621 printw("\nThe prepared move could not be executed.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
622 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
623 eval_move_failed_msg(eval_result);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
624 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
625 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
626 clrtoeol();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
627 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
628 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
629 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
630 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
631
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
632 static int recvmove(GameState *gamestate, GameInfo *gameinfo,
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
633 int opponent, uint8_t mycolor) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
634 memset(gamestate->premove, 0, sizeof(gamestate->premove));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
635
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
636 size_t bufpos = 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
637 char movestr[MOVESTR_BUFLEN];
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
638 bool remis_suggested = false, resign_suggested = false;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
639 while (1) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
640 timecontrol(gamestate, gameinfo);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
641
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
642 move(inputy, 0);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
643 printw("Waiting for opponent. Use chess notation to prepare a move.\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
644 if (*gamestate->premove) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
645 printw("Current pre-move: %s \n\n",
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
646 gamestate->premove);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
647 } else if (remis_suggested && !resign_suggested) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
648 printw("Suggested remis. \n\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
649 } else if (resign_suggested) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
650 if (remis_suggested) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
651 printw("Suggested to resign or at least to accept remis. \n\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
652 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
653 printw("Suggested to resign. \n\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
654 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
655 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
656 printw("Or use a command: remis, resign, taunt, savepgn \n\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
657 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
658 printw("Prepare your next move: ");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
659 clrtoeol();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
660 refresh();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
661
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
662 /* allow the player to prepare a move */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
663 if (asyncgetnstr(movestr, &bufpos, MOVESTR_BUFLEN)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
664 if (strncmp(movestr, "resign", MOVESTR_BUFLEN) == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
665 if (mycolor == WHITE) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
666 gamestate->wresign = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
667 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
668 gamestate->bresign = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
669 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
670 net_send_code(opponent, NETCODE_RESIGN);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
671 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
672 } else if (strncmp(movestr, "taunt", MOVESTR_BUFLEN) == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
673 resign_suggested = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
674 net_send_code(opponent, NETCODE_TAUNT);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
675 } else if (strncmp(movestr, "remis", MOVESTR_BUFLEN) == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
676 remis_suggested = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
677 net_send_code(opponent, NETCODE_REMIS);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
678 } else if (strncmp(movestr, "savepgn", MOVESTR_BUFLEN) == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
679 save_pgn(gamestate, gameinfo);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
680 } else if (movestr[0] == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
681 memset(gamestate->premove, 0, sizeof(gamestate->premove));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
682 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
683 int res = check_move(movestr, mycolor);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
684 if (res == VALID_MOVE_SYNTAX) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
685 strncpy(gamestate->premove, movestr, 8);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
686 memset(movestr, 0, MOVESTR_BUFLEN);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
687 bufpos = 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
688 clrtobot();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
689 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
690 eval_move_failed_msg(res);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
691 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
692 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
693 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
694
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
695 /* read opponent's move */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
696 uint8_t code = net_recieve_code_async(opponent);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
697 switch (code) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
698 case NETCODE_TIMEOVER:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
699 /* redraw the time control */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
700 timecontrol(gamestate, gameinfo);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
701 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
702 case NETCODE_RESIGN:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
703 if (mycolor == WHITE) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
704 gamestate->bresign = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
705 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
706 gamestate->wresign = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
707 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
708 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
709 case NETCODE_CONNLOST:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
710 gamestate->ragequit = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
711 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
712 case NETCODE_REMIS:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
713 if (remis_suggested) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
714 gamestate->remis = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
715 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
716 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
717 if (prompt_yesno(
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
718 "\rYour opponent offers remis - do you accept")) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
719 gamestate->remis = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
720 net_send_code(opponent, NETCODE_ACCEPT);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
721 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
722 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
723 net_send_code(opponent, NETCODE_DECLINE);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
724 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
725 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
726 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
727 case NETCODE_MOVE: {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
728 Move move;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
729 net_recieve_data(opponent, &move, sizeof(Move));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
730 code = validate_move(gamestate, &move);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
731 if (code == VALID_MOVE_SEMANTICS) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
732 apply_move(gamestate, &move);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
733 if (gamestate->checkmate) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
734 net_send_code(opponent, NETCODE_CHECKMATE);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
735 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
736 } else if (gamestate->stalemate) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
737 net_send_code(opponent, NETCODE_STALEMATE);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
738 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
739 } else if (move.check) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
740 net_send_code(opponent, NETCODE_CHECK);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
741 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
742 net_send_code(opponent, NETCODE_ACCEPT);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
743 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
744 return 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
745 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
746 uint32_t reason = htonl(code);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
747 net_send_data(opponent, NETCODE_DECLINE,
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
748 &reason, sizeof(uint32_t));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
749 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
750 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
751 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
752 case NETCODE_ERROR:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
753 printw("\rCannot perform asynchronous network IO");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
754 cbreak(); getch();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
755 exit(EXIT_FAILURE);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
756 case NETCODE_AGAIN:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
757 /* try again */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
758 break;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
759 default:
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
760 printw("\nInvalid network request.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
761 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
762 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
763 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
764
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
765 static void game_review(Settings* settings, GameState *gamestate) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
766 const unsigned page_moves = 10;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
767 GameInfo *gameinfo = &(settings->gameinfo);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
768 GameState viewedstate = {0};
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
769 unsigned viewedmove = gamestate->movecount;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
770 bool redraw = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
771
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
772 noecho();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
773 int c;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
774 do {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
775 if (redraw) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
776 gamestate_cleanup(&viewedstate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
777 gamestate_at_move(gamestate, viewedmove, &viewedstate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
778
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
779 erase(); /* don't use clear() to avoid flickering */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
780 draw_board(&viewedstate, WHITE, settings->unicode);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
781 timecontrol(&viewedstate, gameinfo);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
782
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
783 move(getmaxy(stdscr)-5, 0);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
784 if (gamestate->wresign) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
785 addstr("White resigned.\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
786 } else if (gamestate->bresign) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
787 addstr("Black resigned.\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
788 } else if (gamestate->remis) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
789 addstr("The game ended remis.\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
790 } else if (gamestate->stalemate) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
791 addstr("The game ended in a stalemate.\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
792 } else if (gamestate->checkmate) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
793 printw("%s was checkmated.\n",
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
794 gamestate->movecount % 2 == 0 ? "White" : "Black");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
795 } else if (gamestate->ragequit) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
796 printw("Your opponent disconnected.\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
797 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
798 addstr("\nPress 'q' to quit, 's' to save the position as PGN, or\n"
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
799 "arrow keys, home/end, page up/down to review the game.\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
800 flushinp();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
801 redraw = false;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
802 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
803 c = getch();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
804 if (c == 's') {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
805 addch('\r');
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
806 echo();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
807 save_pgn(&viewedstate, gameinfo);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
808 noecho();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
809 redraw = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
810 } else if (c == KEY_UP || c == KEY_LEFT) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
811 if (viewedmove > 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
812 viewedmove--;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
813 redraw = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
814 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
815 } else if (c == KEY_DOWN || c == KEY_RIGHT) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
816 if (viewedmove < gamestate->movecount) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
817 viewedmove++;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
818 redraw = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
819 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
820 } else if (c == KEY_HOME) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
821 viewedmove = 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
822 redraw = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
823 } else if (c == KEY_END) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
824 viewedmove = gamestate->movecount;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
825 redraw = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
826 } else if (c == KEY_PPAGE) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
827 if (viewedmove > page_moves) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
828 viewedmove -= page_moves;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
829 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
830 viewedmove = 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
831 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
832 redraw = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
833 } else if (c == KEY_NPAGE) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
834 viewedmove += page_moves;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
835 if (viewedmove > gamestate->movecount) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
836 viewedmove = gamestate->movecount;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
837 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
838 redraw = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
839 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
840 } while (c != 'q');
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
841 echo();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
842 gamestate_cleanup(&viewedstate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
843 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
844
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
845 static void game_play_singlemachine(Settings *settings) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
846 inputy = getmaxy(stdscr) - 6;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
847
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
848 GameState gamestate;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
849 gamestate_init(&gamestate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
850 uint8_t curcol = WHITE;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
851
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
852 if (settings->continuepgn) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
853 FILE *pgnfile = fopen(settings->continuepgn, "r");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
854 if (pgnfile) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
855 int result = read_pgn(pgnfile, &gamestate, &(settings->gameinfo));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
856 long position = ftell(pgnfile);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
857 fclose(pgnfile);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
858 if (result) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
859 printw("Invalid PGN file content at position %ld:\n%s\n",
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
860 position, pgn_error_str(result));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
861 return;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
862 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
863 if (!is_game_running(&gamestate)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
864 addstr("Game has ended. Use -S to analyze it.\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
865 return;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
866 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
867 curcol = opponent_color(last_move(&gamestate).piece&COLOR_MASK);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
868 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
869 printw("Can't read PGN file (%s)\n", strerror(errno));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
870 return;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
871 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
872 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
873
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
874 bool running;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
875 do {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
876 clear();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
877 uint8_t perspective = settings->disableflip ? WHITE : curcol;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
878 draw_board(&gamestate, perspective, settings->unicode);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
879 running = !domove_singlemachine(&gamestate,
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
880 &(settings->gameinfo), curcol);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
881 curcol = opponent_color(curcol);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
882 } while (running);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
883
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
884 game_review(settings, &gamestate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
885 gamestate_cleanup(&gamestate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
886 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
887
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
888 static void game_play(Settings *settings, GameState *gamestate, int opponent) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
889 inputy = getmaxy(stdscr) - 6;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
890
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
891 uint8_t mycolor = settings->gameinfo.servercolor;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
892 if (!settings->ishost) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
893 mycolor = opponent_color(mycolor);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
894 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
895
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
896 bool myturn = (gamestate->movecount > 0 ?
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
897 (last_move(gamestate).piece & COLOR_MASK) : BLACK) != mycolor;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
898
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
899 bool running;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
900 do {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
901 clear();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
902 draw_board(gamestate, mycolor, settings->unicode);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
903 if (myturn) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
904 running = !sendmove(gamestate, &(settings->gameinfo),
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
905 opponent, mycolor);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
906 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
907 running = !recvmove(gamestate, &(settings->gameinfo),
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
908 opponent, mycolor);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
909 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
910 myturn ^= true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
911 } while (running);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
912 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
913
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
914 static void dump_gameinfo(GameInfo *gameinfo) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
915 int serverwhite = gameinfo->servercolor == WHITE;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
916 attron(A_UNDERLINE);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
917 printw("Game details\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
918 attroff(A_UNDERLINE);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
919 printw(" Server: %s\n Client: %s\n",
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
920 serverwhite?"White":"Black", serverwhite?"Black":"White"
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
921 );
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
922 if (gameinfo->timecontrol) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
923 if (gameinfo->time % 60) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
924 printw(" Time limit: %ds + %ds\n",
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
925 gameinfo->time, gameinfo->addtime);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
926 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
927 printw(" Time limit: %dm + %ds\n",
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
928 gameinfo->time/60, gameinfo->addtime);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
929 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
930 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
931 printw(" No time limit\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
932 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
933 refresh();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
934 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
935
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
936 static void dump_moveinfo(GameState *gamestate) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
937 for (unsigned i = 0 ; i < gamestate->movecount ; i++) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
938 if (i % 2 == 0) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
939 printw("%d. %s", 1+i/2, gamestate->moves[i].string);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
940 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
941 printw("%s", gamestate->moves[i].string);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
942 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
943 // only five moves reliably fit into one screen row
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
944 if ((i+1) % 10) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
945 addch(' ');
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
946 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
947 addch('\n');
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
948 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
949 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
950 refresh();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
951 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
952
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
953 static int server_fd = -1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
954 static void interrupt_listen(int sig) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
955 if (server_fd > -1) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
956 // this interrupts
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
957 close(server_fd);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
958 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
959 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
960
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
961 static int server_open(Server *server, Settings *settings) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
962 printw("\nListening for client...\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
963 refresh();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
964 if (settings->usedomainsocket
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
965 ? net_create_sock(server, settings->serverhost)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
966 : net_create_tcp(server, settings->port)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
967 addstr("Server creation failed");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
968 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
969 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
970
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
971 // allow Ctrl+C to interrupt the listening process
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
972 server_fd = server->fd;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
973 signal(SIGINT, interrupt_listen);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
974
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
975 if (net_listen(server)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
976 addstr("Listening for client failed or interrupted");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
977 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
978 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
979
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
980 // restore default action
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
981 signal(SIGINT, SIG_DFL);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
982
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
983 return 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
984 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
985
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
986 static int server_handshake(Client *client) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
987 net_send_code(client->fd, NETCODE_VERSION);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
988 if (net_recieve_code(client->fd) != NETCODE_VERSION) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
989 addstr("Client uses an incompatible software version.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
990 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
991 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
992
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
993 addstr("Client connected - transmitting gameinfo...");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
994 refresh();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
995
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
996 return 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
997 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
998
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
999 static int server_run(Settings *settings) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1000 Server server;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1001
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1002 dump_gameinfo(&(settings->gameinfo));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1003 GameState gamestate;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1004 gamestate_init(&gamestate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1005 if (settings->continuepgn) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1006 /* preload PGN data before handshake */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1007 FILE *pgnfile = fopen(settings->continuepgn, "r");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1008 if (pgnfile) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1009 int result = read_pgn(pgnfile, &gamestate,
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1010 &(settings->gameinfo));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1011 long position = ftell(pgnfile);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1012 fclose(pgnfile);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1013 if (result) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1014 printw("Invalid PGN file content at position %ld:\n%s\n",
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1015 position, pgn_error_str(result));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1016 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1017 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1018 if (!is_game_running(&gamestate)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1019 addstr("Game has ended. Use -s to analyze it locally.\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1020 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1021 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1022 addch('\n');
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1023 dump_moveinfo(&gamestate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1024 addch('\n');
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1025 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1026 printw("Can't read PGN file (%s)\n", strerror(errno));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1027 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1028 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1029 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1030
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1031 if (server_open(&server, settings)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1032 net_destroy(&server);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1033 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1034 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1035
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1036 if (server_handshake(server.client)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1037 net_destroy(&server);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1038 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1039 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1040
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1041 int fd = server.client->fd;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1042 if (settings->continuepgn) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1043 /* Continue game, send PGN data */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1044 uint16_t mc = gamestate.movecount;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1045 size_t pgndata_size = sizeof(GameInfo)+sizeof(mc)+mc*sizeof(Move);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1046 char *pgndata = malloc(pgndata_size);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1047 memcpy(pgndata, &(settings->gameinfo), sizeof(GameInfo));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1048 unsigned offset = sizeof(GameInfo);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1049 memcpy(pgndata+offset, &mc, sizeof(mc));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1050 offset += sizeof(mc);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1051 memcpy(pgndata+offset, gamestate.moves, mc*sizeof(Move));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1052 net_send_data(fd, NETCODE_PGNDATA, pgndata, pgndata_size);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1053 free(pgndata);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1054 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1055 /* Start new game */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1056 net_send_data(fd, NETCODE_GAMEINFO,
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1057 &(settings->gameinfo), sizeof(GameInfo));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1058 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1059 addstr("\rClient connected - awaiting challenge acceptance...");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1060 refresh();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1061 int code = net_recieve_code(fd);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1062 int exitcode = 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1063 if (code == NETCODE_ACCEPT) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1064 addstr("\rClient connected - challenge accepted.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1065 clrtoeol();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1066 game_play(settings, &gamestate, fd);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1067 net_destroy(&server);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1068 game_review(settings, &gamestate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1069 } else if (code == NETCODE_DECLINE) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1070 addstr("\rClient connected - challenge declined.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1071 clrtoeol();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1072 net_destroy(&server);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1073 } else if (code == NETCODE_CONNLOST) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1074 addstr("\rClient connected - but gave no response.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1075 clrtoeol();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1076 net_destroy(&server);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1077 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1078 addstr("\rInvalid client response");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1079 clrtoeol();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1080
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1081 net_destroy(&server);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1082 exitcode = 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1083 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1084 gamestate_cleanup(&gamestate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1085 return exitcode;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1086 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1087
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1088
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1089 static int client_connect(Server *server, Settings *settings) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1090 if (settings->usedomainsocket
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1091 ? net_find_sock(server, settings->serverhost)
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1092 : net_find_tcp(server, settings->serverhost, settings->port)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1093 addstr("Can't find server");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1094 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1095 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1096
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1097 if (net_connect(server)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1098 addstr("Can't connect to server");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1099 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1100 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1101
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1102 return 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1103 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1104
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1105 static int client_handshake(Server *server) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1106 if (net_recieve_code(server->fd) != NETCODE_VERSION) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1107 addstr("Server uses an incompatible software version.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1108 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1109 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1110 net_send_code(server->fd, NETCODE_VERSION);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1111 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1112
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1113 printw("Connection established!\n\n");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1114 refresh();
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1115
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1116 return 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1117 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1118
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1119 static int client_run(Settings *settings) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1120 Server server;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1121
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1122 if (client_connect(&server, settings)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1123 net_destroy(&server);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1124 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1125 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1126
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1127 if (client_handshake(&server)) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1128 net_destroy(&server);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1129 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1130 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1131
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1132 uint8_t code = net_recieve_code(server.fd);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1133 GameState gamestate;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1134 gamestate_init(&gamestate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1135 bool played = false;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1136 if (code == NETCODE_GAMEINFO) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1137 /* Start new game */
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1138 net_recieve_data(server.fd, &(settings->gameinfo), sizeof(GameInfo));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1139 dump_gameinfo(&(settings->gameinfo));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1140 if (prompt_yesno("Accept challenge")) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1141 net_send_code(server.fd, NETCODE_ACCEPT);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1142 game_play(settings, &gamestate, server.fd);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1143 played = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1144 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1145 net_send_code(server.fd, NETCODE_DECLINE);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1146 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1147 } else if (code == NETCODE_PGNDATA) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1148 net_recieve_data(server.fd, &(settings->gameinfo), sizeof(GameInfo));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1149 dump_gameinfo(&(settings->gameinfo));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1150 uint16_t mc;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1151 net_recieve_data(server.fd, &mc, sizeof(mc));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1152 Move *moves = calloc(mc, sizeof(Move));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1153 net_recieve_data(server.fd, moves, mc*sizeof(Move));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1154 for (size_t i = 0 ; i < mc ; i++) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1155 apply_move(&gamestate, &(moves[i]));
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1156 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1157 free(moves);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1158 addch('\n');
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1159 dump_moveinfo(&gamestate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1160 if (prompt_yesno(
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1161 "\n\nServer wants to continue a game. Accept challenge")) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1162 net_send_code(server.fd, NETCODE_ACCEPT);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1163 game_play(settings, &gamestate, server.fd);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1164 played = true;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1165 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1166 net_send_code(server.fd, NETCODE_DECLINE);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1167 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1168 } else {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1169 addstr("Server sent invalid gameinfo.");
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1170 net_destroy(&server);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1171 return 1;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1172 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1173
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1174 if (played) {
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1175 game_review(settings, &gamestate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1176 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1177 gamestate_cleanup(&gamestate);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1178
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1179 net_destroy(&server);
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1180 return 0;
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1181 }
189c7c77aaab simplify code structure
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1182
0
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1183 int main(int argc, char **argv) {
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
1184 srand(time(NULL));
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
1185
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
1186 init_settings();
2
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
1187 if (get_settings(argc, argv, &settings)) {
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
1188 return 1;
0a08f79c320d fixed network code + added game info and transmission of game info
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
1189 }
52
26707039d5a6 added program version
Mike Becker <universe@uap-core.de>
parents: 51
diff changeset
1190
23
824c9522ce66 introduced game state structure
Mike Becker <universe@uap-core.de>
parents: 16
diff changeset
1191 initscr();
34
c4d4b8a8f902 added nonblocking read for network games + minor build system fixes
Mike Becker <universe@uap-core.de>
parents: 33
diff changeset
1192 halfdelay(1);
80
b980a7192b5a replace _Bool with bool from C23 and/or stdbool.h
Mike Becker <universe@uap-core.de>
parents: 78
diff changeset
1193 keypad(stdscr, true);
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 5
diff changeset
1194 if (has_colors()) {
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 5
diff changeset
1195 start_color();
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 5
diff changeset
1196 init_colorpairs();
35
6c64b7a073af tried to improve colors
Mike Becker <universe@uap-core.de>
parents: 34
diff changeset
1197 bkgd(COLOR_PAIR(COL_APP));
7
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 5
diff changeset
1198 } else {
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 5
diff changeset
1199 fprintf(stderr, "Non-colored terminals are not supported yet.");
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 5
diff changeset
1200 endwin();
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 5
diff changeset
1201 return EXIT_FAILURE;
41468077b5bb implemented chess board and remis/surrender messages
Mike Becker <universe@uap-core.de>
parents: 5
diff changeset
1202 }
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
1203 atexit(cleanup);
3
3693fd2eb0e9 changed UI to ncurses session + added network handshake
Mike Becker <universe@uap-core.de>
parents: 2
diff changeset
1204
46
4dcfb4c58b6d netcode is now aware of connection losses
Mike Becker <universe@uap-core.de>
parents: 35
diff changeset
1205 int exitcode;
26
e0a76ee1bb2b introduced single machine mode
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
1206 if (settings.singlemachine) {
83
ead00609e5e6 fix that network connection is still open during game review
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1207 game_play_singlemachine(&settings);
46
4dcfb4c58b6d netcode is now aware of connection losses
Mike Becker <universe@uap-core.de>
parents: 35
diff changeset
1208 exitcode = EXIT_SUCCESS;
26
e0a76ee1bb2b introduced single machine mode
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
1209 } else {
94
864f59271974 implement option to play via Unix domain socket
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
1210 exitcode = settings.ishost ?
26
e0a76ee1bb2b introduced single machine mode
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
1211 server_run(&settings) : client_run(&settings);
e0a76ee1bb2b introduced single machine mode
Mike Becker <universe@uap-core.de>
parents: 23
diff changeset
1212 }
46
4dcfb4c58b6d netcode is now aware of connection losses
Mike Becker <universe@uap-core.de>
parents: 35
diff changeset
1213
4dcfb4c58b6d netcode is now aware of connection losses
Mike Becker <universe@uap-core.de>
parents: 35
diff changeset
1214 mvaddstr(getmaxy(stdscr)-1, 0,
4dcfb4c58b6d netcode is now aware of connection losses
Mike Becker <universe@uap-core.de>
parents: 35
diff changeset
1215 "Game has ended. Press any key to leave...");
50
41017d0a72c5 added pgn parser and writer (without comment support yet) + minor refactorings
Mike Becker <universe@uap-core.de>
parents: 47
diff changeset
1216 clrtoeol();
46
4dcfb4c58b6d netcode is now aware of connection losses
Mike Becker <universe@uap-core.de>
parents: 35
diff changeset
1217 refresh();
4dcfb4c58b6d netcode is now aware of connection losses
Mike Becker <universe@uap-core.de>
parents: 35
diff changeset
1218 cbreak();
4dcfb4c58b6d netcode is now aware of connection losses
Mike Becker <universe@uap-core.de>
parents: 35
diff changeset
1219 flushinp();
4dcfb4c58b6d netcode is now aware of connection losses
Mike Becker <universe@uap-core.de>
parents: 35
diff changeset
1220 getch();
4dcfb4c58b6d netcode is now aware of connection losses
Mike Becker <universe@uap-core.de>
parents: 35
diff changeset
1221
4dcfb4c58b6d netcode is now aware of connection losses
Mike Becker <universe@uap-core.de>
parents: 35
diff changeset
1222 return exitcode;
0
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1223 }
98034084033f init project
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1224

mercurial