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