1 /*
2  * The Rubik's cube.
3  *
4  * Sed - april 1999 / december 2003.
5  *
6  * This program is in the public domain.
7  *--------------------
8  * The main file.
9  */
10 
11 #include <stdio.h>
12 #include <ctype.h>
13 #include <math.h>
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <string.h>
17 
18 #include "messages.h"
19 #include "screen.h"
20 #include "cube.h"
21 #include "event.h"
22 #include "device.h"
23 #include "version.h"
24 
25 device d;
26 
27 char *the_screen;
28 
29 double EDGE;
30 char *FONT;
31 int HELP_X;
32 int HELP_Y;
33 int FORMAT = 0;
34 
35 int SCREEN_X;
36 int SCREEN_Y;
37 double CUBE_SIZE;
38 double PERSPECTIVE;
39 
40 /* J.-P. Demailly's coloring way... */
41 char *palette[11] = {
42    "grey50",          /* face X (empty) */
43    "green",           /* face A */
44    "red",             /* face B */
45    "royalblue1",      /* face C */
46    "yellow",          /* face D */
47    "orange",          /* face E */
48    "ivory",           /* face F */
49    "grey24",          /* internal faces */
50    "red4",            /* cross & letters color */
51    "white",           /* foreground color */
52    "black",           /* background color */
53 };
54 
55 char *formats[] = { "position", "numeric", "generators"};
56 
usage()57 void usage()
58 {
59   int i;
60 
61   fprintf(stderr, "\n");
62   for (i=0; i<help_numlines; i++)
63       fprintf(stderr, "%s\n", help_index[i]);
64 }
65 
main(int nb,char ** argv)66 int main(int nb, char **argv)
67 {
68   CUBE cube;
69   SCREEN screen;
70 
71   int i, j;
72   int rand=1;
73   char *filename = NULL;
74   char *ptr;
75 
76   FONT = "7x13";
77   EDGE = 0.475;
78 
79   SCREEN_X = 320;
80   SCREEN_Y = 360;
81   PERSPECTIVE = 0.3;  /* 0.2 changed to 0.3, I like it better - Sed */
82 
83   ptr = help_msg;
84   help_numlines = 1;
85   i = 0;
86   help_index = (char **) malloc(sizeof(char *));
87   help_index[0] = ptr;
88 
89   while(*ptr) {
90     if (*ptr=='\n') {
91       *ptr = '\0';
92       help_index = (char **) realloc(help_index,
93 			             (help_numlines+1)*sizeof(char *));
94       help_index[help_numlines] = ptr+1;
95       ++help_numlines;
96       if (i>help_maxlen) help_maxlen = i;
97       i = 0;
98     }
99     ++ptr;
100     ++i;
101   }
102 
103   the_screen=&screen.buffer[0];
104   d.buffer=(unsigned char*)screen.buffer;
105   screen.buffer = NULL;
106   screen.im = 0;
107 
108   for (i=1; i<nb; i++) {
109     if (!strcasecmp(argv[i], "-h") || !strcasecmp(argv[i], "--h") || !strcasecmp(argv[i], "-help") ||
110 	!strcasecmp(argv[i], "--help")) {
111       usage();
112       return 0;
113     }
114     if (!strcasecmp(argv[i], "-i") || !strcasecmp(argv[i], "--i") || !strcasecmp(argv[i], "-init") || !strcasecmp(argv[i], "--init")) {
115       rand = 0;
116       continue;
117     }
118     if (!strcasecmp(argv[i], "-v") || !strcasecmp(argv[i], "--v") || !strcasecmp(argv[i], "-version") ||
119 	!strcasecmp(argv[i], "--version")) {
120       fprintf(stderr, "%s\n", VERSION);
121       return 0;
122     }
123     if (i<nb-1 && (!strcasecmp(argv[i], "-e") ||
124 		   !strcasecmp(argv[i], "--e") ||
125 		   !strcasecmp(argv[i], "-edge") ||
126 		   !strcasecmp(argv[i], "--edge"))) {
127       EDGE = 0.5 * atof(argv[++i]);
128       if (EDGE<0.1) EDGE = 0.1;
129       if (EDGE>0.5) EDGE = 0.5;
130       continue;
131     }
132     if (i<nb-1 && (!strcasecmp(argv[i], "-l") ||
133 		   !strcasecmp(argv[i], "--l") ||
134 		   !strcasecmp(argv[i], "-load") ||
135 		   !strcasecmp(argv[i], "--load"))) {
136       filename = argv[++i];
137       continue;
138     }
139     if (i<nb-1 && (!strcasecmp(argv[i], "-fn") ||
140 		   !strcasecmp(argv[i], "--fn") ||
141 		   !strcasecmp(argv[i], "-font") ||
142 		   !strcasecmp(argv[i], "--font"))) {
143       FONT = argv[++i];
144       continue;
145     }
146     if (i<nb-1 && (!strcasecmp(argv[i], "-fm") ||
147 		   !strcasecmp(argv[i], "--fm") ||
148 		   !strcasecmp(argv[i], "-format") ||
149 		   !strcasecmp(argv[i], "--format"))) {
150       FORMAT = atoi(argv[++i]);
151       if (FORMAT<0 || FORMAT>2) FORMAT = 2;
152       continue;
153     }
154     if (i<nb-1 && (!strcasecmp(argv[i], "-width") ||
155 		   !strcasecmp(argv[i], "--width"))) {
156       SCREEN_X = atoi(argv[++i]);
157       if (SCREEN_X<80) SCREEN_X = 80;
158       if (SCREEN_X>1600) SCREEN_X = 1600;
159       continue;
160     }
161     if (i<nb-1 && (!strcasecmp(argv[i], "-height") ||
162 		   !strcasecmp(argv[i], "--height"))) {
163       SCREEN_Y = atoi(argv[++i]);
164       if (SCREEN_Y<60) SCREEN_Y = 60;
165       if (SCREEN_Y>1200) SCREEN_Y = 1200;
166       continue;
167     }
168     if (i<nb-2 && (!strcasecmp(argv[i], "-color") ||
169 		   !strcasecmp(argv[i], "--color"))) {
170       ++i;
171       if (argv[i][0]=='x' || argv[i][0]=='X') j = 0;
172         else
173       if (argv[i][0]=='i' || argv[i][0]=='I') j = 7;
174         else
175       if (argv[i][0]=='0') j = 10;
176         else
177       if (argv[i][0]=='1') j = 9;
178         else
179       if (argv[i][0]=='2') j = 8;
180         else
181       j = toupper(argv[i][0])-'A' + 1;
182       if (j>=0 && j<=10) palette[j] = argv[++i];
183       continue;
184     }
185     fprintf(stderr, "unknown option %s\n", argv[i]);
186     usage();
187     return 1;
188   }
189   set_cube_size();
190 
191   if (init_screen(&screen)==-1) {
192     fprintf(stderr, "Error with initing the screen.\n");
193     return -1;
194   }
195 
196   reset_cube(&cube);
197 
198   if (filename)
199     init_cube(&cube, filename, 0);
200   else
201     init_cube(&cube, NULL, rand);
202 
203   realize_colors(&screen);
204   screen.pause = 1;
205   grab_pointer(&screen, 0);
206   display_cube(&cube, &screen);
207 
208   while(1) {
209     int d=wait_event(&screen, &cube);
210 
211     if (!(d&SCREEN_EVENT)) {
212       if (cube.anim)
213 	display_cube(&cube, &screen);
214     } else {
215       if (screen_event(&screen, &cube)==-1)
216 	break;
217     }
218   }
219 
220   close_screen(&screen);
221 
222   return 0;
223 }
224