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