3 * Daniel Nelson - 8/29/0
5 * Copyright (C) 2000 Daniel Nelson
6 * Copyright (C) 2004 Andrew Sayman
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 * Daniel Nelson - aluminumangel.org
42 #include "TextureLoader.h"
43 #include "Communicator.h"
44 #include "MetaState.h"
53 #include "gtk-gui/gui_main.h"
56 #define GC_HOST_NAME_SIZE (256)
60 * html tables don't work right in explorer
64 * slow if left sitting a long time before game start
65 * central server for online game setup
66 * remove dying_count_2
67 * find and use correct GL_LIGHT_MODEL_COLOR_CONTROL defines
72 int main ( int argc
, char **argv
)
74 setupLocalDataDirectory();
76 if (argc
<= 1) return gui_main(argc
, argv
);
78 char player_name
[GC_PLAYER_NAME_LENGTH
];
79 char host_name
[GC_HOST_NAME_SIZE
];
82 int height
= -1, width
= -1;
84 player_name
[0] = '\0';
85 glutInit(&argc
, argv
);
86 parseCommandLine(argc
, argv
, mode
, port
, host_name
, player_name
, height
, width
);
87 run_crack_attack(mode
, port
, host_name
, player_name
, height
, width
);
94 std::cerr
<< "Usage: " GC_BINARY
" --server [PORT] [--low] [--extreme] "
95 "[--wait] [--name 'NAME']\n"
97 " " GC_BINARY
" SERVER PORT [[--really] --low] [--name 'NAME']\n"
99 " " GC_BINARY
" --solo [[--really] --low] [-X] [--name 'NAME']\n"
101 " " GC_BINARY
" -1 [[-r] -l] [-X] [-n 'NAME']\n"
102 " <or with a computer opponent>\n"
103 " " GC_BINARY
" --solo [--hard] [--easy] [--medium] [[--really] --low]"
110 void run_crack_attack (
118 std::cerr
<< "Player name not properly allocated" << std::endl
;
122 if (player_name
[0] == '\0') {
124 struct passwd
*uinfo
= getpwuid(getuid());
126 strncpy(player_name
, uinfo
->pw_name
, GC_PLAYER_NAME_LENGTH
);
127 for (int n
= strlen(player_name
); n
--; )
128 player_name
[n
] = toupper(player_name
[n
]);
130 strncpy(player_name
, GC_DEFAULT_PLAYER_NAME
, GC_PLAYER_NAME_LENGTH
);
132 strncpy(player_name
, GC_DEFAULT_PLAYER_NAME
, GC_PLAYER_NAME_LENGTH
);
136 std::cout
<< GC_MESSAGE
<< std::endl
;
138 if (!(mode
& CM_SOLO
))
139 Communicator::initialize(mode
, port
, host_name
, player_name
);
141 Random::seed(Random::generateSeed());
143 MetaState::programStart(mode
, player_name
, width
, height
);
149 Music::play_prelude();
162 void parseCommandLine ( int argc
, char **argv
, int &mode
, int &port
,
163 char *host_name
, char *player_name
, int &height
, int &width
)
165 for (int n
= 1; argv
[n
]; n
++) {
167 if (!strcmp(argv
[n
], "--nosound"))
170 if (!strcmp(argv
[n
], "-s") || !strcmp(argv
[n
], "--server")) {
171 if (mode
& (CM_SERVER
| CM_CLIENT
| CM_SOLO
)) usage();
174 if (argv
[n
+ 1] && argv
[n
+ 1][0] != '-')
175 port
= atoi(argv
[++n
]);
179 } else if (!strcmp(argv
[n
], "-1") || !strcmp(argv
[n
], "--solo")) {
180 if (mode
& (CM_SERVER
| CM_CLIENT
| CM_SOLO
)) usage();
184 } else if (!strcmp(argv
[n
], "-n") || !strcmp(argv
[n
], "--name")) {
185 if (!argv
[n
+ 1]) usage();
187 strncpy(player_name
, argv
[++n
], GC_PLAYER_NAME_LENGTH
);
188 player_name
[GC_PLAYER_NAME_LENGTH
- 1] = '\0';
189 for (char *p
= player_name
; *p
; p
++)
190 if (!isprint(*p
)) *p
= ' ';
192 } else if (!strcmp(argv
[n
], "-l") || !strcmp(argv
[n
], "--low"))
194 mode
|= CM_LOW_GRAPHICS
;
196 else if (!strcmp(argv
[n
], "-r") || !strcmp(argv
[n
], "--really")) {
198 mode
|= CM_LOW_GRAPHICS
;
199 mode
|= CM_REALLY_LOW_GRAPHICS
;
201 } else if (!strcmp(argv
[n
], "-X") || !strcmp(argv
[n
], "--extreme"))
205 else if (!strcmp(argv
[n
], "-w") || !strcmp(argv
[n
], "--wait"))
206 mode
|= CM_NO_TIME_OUT
;
208 else if (!strcmp(argv
[n
], "--hard")) {
212 } else if (!strcmp(argv
[n
], "--easy")) {
216 } else if (!strcmp(argv
[n
], "--medium")) {
218 mode
|= CM_AI_MEDIUM
;
220 } else if (!strcmp(argv
[n
], "--res")) {
221 if (argv
[n
+ 1] && argv
[n
+ 1][0] != '-')
222 height
= width
= atoi(argv
[++n
]);
227 if (mode
& (CM_SERVER
| CM_CLIENT
| CM_SOLO
)) usage();
230 strncpy(host_name
, argv
[n
], GC_HOST_NAME_SIZE
);
233 port
= atoi(argv
[n
]);
236 std::cerr
<< "No port specified.\n";
242 if (!(mode
& (CM_SERVER
| CM_CLIENT
| CM_SOLO
)))
245 if ((mode
& CM_NO_TIME_OUT
) && !(mode
& CM_SERVER
))
248 if ((mode
& CM_REALLY_LOW_GRAPHICS
) && !(mode
& CM_LOW_GRAPHICS
))
251 if ((mode
& CM_AI
&& (mode
& CM_X
)))
255 #define MKDIR(x,y) (mkdir(x, y))
259 # define MKDIR(x,y) (_mkdir(x))
262 void setupLocalDataDirectory ( )
264 char local_directory
[256];
265 TextureLoader::buildLocalDataDirectoryName(local_directory
);
266 if (!TextureLoader::fileExists(local_directory
)
267 && MKDIR(local_directory
, 0777)
269 std::cerr
<< "Error creating local data directory '" << local_directory
270 << "'." << std::endl
;