1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <X11/Xlib.h>
6 #include <math.h>
7 #include "struct.h"
8 #include "patchlevel.h"
9
10 extern Bool flumping, wflump, fflump, jflump, perfection;
11 int botmode; /* 1 for 2 player, 0 for 1 vs bot */
12 int boards;
13 int botlevel;
14
15 char *itoa(); /* gross version */
16 char *rand_board();
17 int get_num_boards();
18
19 char disp[90];
20 Bool fb;
21 char fbd[90];
22
showopts()23 showopts()
24 {
25 fprintf(stderr, "Syntax: xataxx <-jnw> <-d displayname> <-l level number>\n");
26 fprintf(stderr, " -d display name: name of opponents xhosted display.\n");
27 fprintf(stderr, " -j zot only on moves\n");
28 fprintf(stderr, " -l level number: number of look-ahead turns for robot (0-9).\n");
29 fprintf(stderr, " -n no zotting\n");
30 fprintf(stderr, " -p make it perfect\n");
31 fprintf(stderr, " -w will zot always\n");
32 }
33
process_flags(arg,n)34 process_flags(arg, n)
35 char **arg;
36 int n;
37 {
38 int x;
39
40 for(x=1;x<strlen(arg[n]);x++) {
41 switch(arg[n][x]) {
42 case 'b':
43 strcpy(fbd, arg[n+1]);
44 strcat(fbd, BOARDEXT);
45 fb = False;
46 break;
47 case 'd':
48 botmode=1;
49 strcpy(disp, arg[n+1]);
50 if (arg[n+1][strlen(arg[n+1])-2] != ':')
51 strcat(disp, ":0");
52 break;
53 case 'f':
54 fflump = False;
55 break;
56 case 'h':
57 showopts();
58 exit(0);
59 break;
60 case 'l':
61 botlevel = arg[n+1][0] - '0';
62 if (botlevel < 0 || botlevel > 9) {
63 showopts();
64 exit(0);
65 }
66 break;
67 case 'j':
68 jflump = False;
69 break;
70 case 'n':
71 wflump = False;
72 break;
73 case 'p':
74 perfection = True;
75 break;
76 case 'w':
77 wflump = True;
78 jflump = True;
79 flumping = True;
80 break;
81 default:
82 showopts();
83 exit(0);
84 break;
85 }
86 }
87 }
88
main(argc,argv)89 main(argc,argv)
90 int argc;
91 char *argv[];
92 {
93 int n, q;
94
95 botmode = 0;
96 botlevel = 2;
97 flumping = True;
98 wflump = True;
99 fflump = True;
100 jflump = False;
101 perfection = False;
102
103 fb = True;
104 if (argc>1)
105 for(n=1;n<argc;n++) {
106 if (argv[n][0] == '-')
107 process_flags(argv, n);
108 }
109
110 chdir(DATADIR);
111
112 boards = get_num_boards();
113
114 /* Load the input board */
115 if (fb) {
116 if (load_board(rand_board()))
117 exit(1);
118 }
119 else {
120 if (load_board(fbd)) {
121 fprintf(stderr, "You twit- that's not a valid board #.\n");
122 fprintf(stderr, "If you're gonna try that, talk to Jim to find out how.\n");
123 exit(1);
124 }
125 }
126
127 /* Start up the windows */
128 initialize_display(disp);
129
130 readbitmaps();
131
132 show_title();
133
134 while(1) {
135 if (waitferkey(8)) {
136 if (!demo())
137 waitferkey(5);
138 show_title();
139 }
140 else {
141 init_pieces();
142 play_loop();
143 }
144 if (load_board(rand_board()))
145 exit(1);
146 }
147 }
148
rand_board()149 char *rand_board()
150 {
151 int bd;
152 static char fname[200];
153
154 srandom(time(NULL));
155 bd = random()%boards;
156 bd++;
157 strcpy(fname, itoa(bd));
158 strcat(fname, BOARDEXT);
159 return(fname);
160 }
161
itoa(x)162 char *itoa(x) /* gross version - replace this hack ASAP */
163 int x;
164 {
165 int z1, z2, z3, z4, z=0;
166 static char nn[6];
167
168 z1 = (int) (x)/1000;
169 z2 = (int) (x)/100-(10*z1);
170 z3 = (int) (x)/10-(100*z1)-(10*z2);
171 z4 = (int) (x)-(1000*z1)-(100*z2)-(10*z3);
172
173 if (z1)
174 nn[z++]=(z1+'0');
175 if (z2)
176 nn[z++]=(z2+'0');
177 if (z3)
178 nn[z++]=(z3+'0');
179 if (z4)
180 nn[z++]=(z4+'0');
181 nn[z++]='\0';
182 return(nn);
183 }
184
get_num_boards()185 int get_num_boards()
186 {
187 FILE *bdfile;
188 int bdx;
189
190 if((bdfile = fopen(BOARDNUMFILE, "r")) == NULL) {
191 fprintf(stderr, "Cannot open %s for reading.\n", BOARDNUMFILE);
192 exit(1);
193 }
194 boards = 0;
195 fscanf(bdfile, "%d", &bdx);
196 fclose(bdfile);
197 if (bdx<1) {
198 fprintf(stderr, "Invalid number of allowable boards.\n");
199 exit(1);
200 }
201 return(bdx);
202 }
203
204