1 /*
2 * Copyright (c) 2000 Mark B. Allan. All rights reserved.
3 *
4 * "Chromium B.S.U." is free software; you can redistribute
5 * it and/or use it and/or modify it under the terms of the
6 * "Clarified Artistic License"
7 */
8
9 #ifdef HAVE_CONFIG_H
10 #include <chromium-bsu-config.h>
11 #endif
12
13 #include "gettext.h"
14
15 #include "compatibility.h"
16
17 #if defined(HAVE_APPLE_OPENGL_FRAMEWORK) || defined(HAVE_OPENGL_GL_H)
18 #include <OpenGL/gl.h>
19 #else
20 #include <GL/gl.h>
21 #endif
22
23 #include <cstdlib>
24 #include <cstdio>
25 #include <cstring>
26 #include <ctime>
27
28 #ifndef _WIN32
29 #include <unistd.h>
30 #include <fcntl.h>
31 #include <cerrno>
32 #endif // _WIN32
33
34 #include <sys/stat.h>
35
36 #ifdef ENABLE_NLS
37 #include <locale.h>
38 #include <libintl.h>
39 #endif
40
41 #include "main.h"
42 #include "define.h"
43 #include "MainSDL.h"
44 #include "MainGLUT.h"
45
46 #include "Config.h"
47 #include "extern.h"
48 #include "Global.h"
49 #include "HiScore.h"
50
51 #include "EnemyAircraft.h"
52
53 //----------------------------------------------------------
main(int argc,char ** argv)54 int main(int argc, char **argv)
55 {
56 int i;
57 int tmp;
58 int vm = 2;
59
60 #ifdef ENABLE_NLS
61 setlocale(LC_ALL, "");
62 bindtextdomain(PACKAGE, LOCALEDIR);
63 bind_textdomain_codeset(PACKAGE, "UTF-8");
64 textdomain(PACKAGE);
65 #endif
66
67 #ifdef __linux__
68 // by default, disable SDL's use of DGA mouse. If SDL_VIDEO_X11_DGAMOUSE is
69 // set however, use default value.
70 setenv("SDL_VIDEO_X11_DGAMOUSE", "0", false);
71 #endif
72
73 Config *config = Config::init();
74 Global *game = Global::init();
75 HiScore *hiScore = HiScore::init();
76
77 for ( i=1; i < argc; i++ )
78 {
79 if ( strcmp(argv[i], "-f") == 0 || strcmp(argv[i], "--fullscreen") == 0 )
80 {
81 config->setFullScreen(true);
82 }
83 else if ( strcmp(argv[i], "-w") == 0 || strcmp(argv[i], "--window") == 0 )
84 {
85 config->setFullScreen(false);
86 }
87 else if ( strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--vidmode") == 0 )
88 {
89 if((i+1) < argc)
90 {
91 sscanf(argv[i+1], "%d", &tmp);
92 if(tmp <= MAX_SCREEN_SIZE && tmp >= 0)
93 {
94 vm = tmp;
95 i++;
96 }
97 }
98 config->setScreenSize(vm);
99 }
100 else if( strcmp(argv[i], "-na") == 0 || strcmp(argv[i], "--noaudio") == 0)
101 {
102 config->setAudio(false);
103 }
104 else if( strcmp(argv[i], "-nb") == 0 || strcmp(argv[i], "--noblend") == 0)
105 {
106 config->setBlend(false);
107 }
108 else if( strcmp(argv[i], "-nt") == 0 || strcmp(argv[i], "--notexborder") == 0)
109 {
110 config->setTexBorder(false);
111 }
112 else if( strcmp(argv[i], "--debug") == 0)
113 {
114 config->setDebug(true);
115 }
116 else if( strcmp(argv[i], "-V") == 0 || strcmp(argv[i], "--version") == 0)
117 {
118 printf("%s\n", PACKAGE_STRING);
119 exit(0);
120 }
121 else
122 {
123 fprintf(stderr, _(
124 "\n"
125 "--------------------------------------------------\n"
126 "Chromium B.S.U. options\n"
127 "--------------------------------------------------\n"
128 " -f/--fullscreen : run in fullscreen mode\n"
129 " -w/--window : run in windowed mode\n"
130 " -v/--vidmode <mode> : mode 0 = 512 x 384\n"
131 " : 1 = 640 x 480\n"
132 " : 2 = 800 x 600\n"
133 " : 3 = 1024 x 768\n"
134 " : 4 = 1280 x 960\n"
135 " -na/--noaudio : do not initialize audio\n"
136 " -nb/--noblend : disable blending (OpenGL)\n"
137 " -nt/--notexborder : do not set tex border color (OpenGL)\n"
138 " -V/--version : show version information\n"
139 "--------------------------------------------------\n\n"));
140 exit(0);
141 }
142 }
143
144 if( config->debug() ) atexit(EnemyAircraft::printNumAllocated);
145
146 srand(time(NULL));
147
148 game->generateRandom();
149
150 #ifdef USE_SDL
151 game->toolkit = new MainSDL(argc, argv);
152 #elif USE_GLUT
153 game->toolkit = new MainGLUT(argc, argv);
154 #else
155 #error "USE_SDL or USE_GLUT must be defined"
156 #endif
157
158 if( config->debug() ) hiScore->print(config->intSkill());
159 game->toolkit->run();
160
161 hiScore->destroy();
162 config->destroy();
163 game->destroy();
164
165 return 0;
166 }
167
168 // Changes '/' to ':' for Mac paths, is a no-op for other platforms.
169 //----------------------------------------------------------
alterPathForPlatform(char * filename)170 const char* alterPathForPlatform(char* filename)
171 {
172 #ifdef macintosh
173 char *walker = filename;
174 while( *walker )
175 {
176 if(*walker == '/' )
177 *walker = ':';
178 walker++;
179 }
180 #endif
181 #ifdef _WIN32
182 char *walker = filename;
183 while( *walker )
184 {
185 if(*walker == '/' )
186 *walker = '\\';
187 walker++;
188 }
189 #endif
190 return filename;
191 }
192
193 //----------------------------------------------------------
dataLoc(const char * filename,bool doCheck)194 const char* dataLoc(const char* filename, bool doCheck)
195 {
196 static char buffer[256];
197 struct stat sbuf;
198
199 if(getenv("CHROMIUM_BSU_DATA") != NULL && ((strlen(getenv("CHROMIUM_BSU_DATA"))+strlen(filename)) < 254) )
200 {
201 sprintf(buffer, "%s/%s", getenv("CHROMIUM_BSU_DATA"), filename);
202 if(stat(buffer, &sbuf) == 0) return buffer;
203 }
204
205 if(getenv("HOME") != NULL && ((strlen(getenv("HOME"))+strlen(filename)) < 239) )
206 {
207 sprintf(buffer, "%s/." PACKAGE "-data/%s", getenv("HOME"), filename);
208 if(stat(buffer, &sbuf) == 0) return buffer;
209 }
210
211 #ifdef PKGDATADIR
212 if( ((strlen(PKGDATADIR)+strlen(filename)) < 254) )
213 {
214 sprintf(buffer, "%s/%s", PKGDATADIR, filename);
215 if(stat(buffer, &sbuf) == 0) return buffer;
216 }
217 #endif
218
219 #ifdef macintosh
220 #define DATADIR "::data"
221 #else
222 #define DATADIR "../data"
223 #endif
224
225 if( (strlen(DATADIR)+strlen(filename)) < 254)
226 {
227 sprintf(buffer, "%s/%s", DATADIR, filename);
228 }
229
230 alterPathForPlatform(buffer);
231
232 #ifndef _WIN32 // WIN32 users don't get error checks...
233 if(doCheck)
234 {
235 if(stat(buffer, &sbuf) == -1)
236 {
237 fprintf(stderr, _("!! ERROR !! - "));
238 perror(buffer);
239 }
240 }
241 #endif
242
243 #ifdef CHECK_ERRORS
244 // fprintf(stderr, "dataLoc(\"%s\")\n", buffer);
245 #endif
246 return buffer;
247 }
248
249 //----------------------------------------------------------
printExtensions(FILE * fstream,const char * extstr_in)250 void printExtensions(FILE *fstream, const char* extstr_in)
251 {
252 char *extstr;
253 char *walker;
254 char *space;
255 int len = strlen(extstr_in);
256 int cnt = 0;
257 extstr = new char[len+1];
258 strcpy(extstr, extstr_in);
259 walker = extstr;
260
261 fprintf(fstream, _("Extensions :"));
262 while( (walker-extstr) < len )
263 {
264 space = strchr(walker, ' ');
265 if(space)
266 {
267 if( (cnt%2) == 0)
268 fprintf(fstream, "\n");
269 *space = '\0';
270 fprintf(fstream, "%-31s ", walker);
271 walker = space+1;
272 cnt++;
273 }
274 else
275 break;
276 }
277 fprintf(fstream, "\n");
278
279 delete [] extstr;
280 }
281