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"
44 #include "Communicator.h"
45 #include "MetaState.h"
54 #include "gtk-gui/gui_main.h"
57 #define GC_HOST_NAME_SIZE (256)
61 * html tables don't work right in explorer
65 * slow if left sitting a long time before game start
67 * central server for online game setup
68 * remove dying_count_2
69 * find and use correct GL_LIGHT_MODEL_COLOR_CONTROL defines
74 int main ( int argc
, char **argv
)
76 setupLocalDataDirectory();
78 if (argc
<= 1) return gui_main(argc
, argv
);
80 char player_name
[GC_PLAYER_NAME_LENGTH
];
81 char host_name
[GC_HOST_NAME_SIZE
];
84 int height
= -1, width
= -1;
86 player_name
[0] = '\0';
87 parseCommandLine(argc
, argv
, mode
, port
, host_name
, player_name
, height
, width
);
88 run_crack_attack(mode
, port
, host_name
, player_name
, height
, width
);
95 cerr
<< "Usage: " GC_BINARY
" --server [PORT] [--low] [--extreme] [--wait] "
98 " " GC_BINARY
" SERVER PORT [[--really] --low] [--name 'NAME']\n"
100 " " GC_BINARY
" --solo [[--really] --low] [-X] [--name 'NAME']\n"
102 " " GC_BINARY
" -1 [[-r] -l] [-X] [-n 'NAME']\n"
103 " <or with a computer opponent>\n"
104 " " GC_BINARY
" --solo [--hard] [--easy] [--medium] [[--really] --low]"
111 void run_crack_attack (
119 cerr
<< "Player name not properly allocated" << endl
;
123 if (player_name
[0] == '\0') {
125 struct passwd
*uinfo
= getpwuid(getuid());
127 strncpy(player_name
, uinfo
->pw_name
, GC_PLAYER_NAME_LENGTH
);
128 for (int n
= strlen(player_name
); n
--; )
129 player_name
[n
] = toupper(player_name
[n
]);
131 strncpy(player_name
, GC_DEFAULT_PLAYER_NAME
, GC_PLAYER_NAME_LENGTH
);
133 strncpy(player_name
, GC_DEFAULT_PLAYER_NAME
, GC_PLAYER_NAME_LENGTH
);
137 cout
<< GC_MESSAGE
<< endl
;
139 if (!(mode
& CM_SOLO
))
140 Communicator::initialize(mode
, port
, host_name
, player_name
);
142 Random::seed(Random::generateSeed());
144 MetaState::programStart(mode
, player_name
, width
, height
);
150 Music::play_prelude();
163 void parseCommandLine ( int argc
, char **argv
, int &mode
, int &port
,
164 char *host_name
, char *player_name
, int &height
, int &width
)
166 for (int n
= 1; argv
[n
]; n
++) {
168 if (!strcmp(argv
[n
], "--nosound"))
171 if (!strcmp(argv
[n
], "-s") || !strcmp(argv
[n
], "--server")) {
172 if (mode
& (CM_SERVER
| CM_CLIENT
| CM_SOLO
)) usage();
175 if (argv
[n
+ 1] && argv
[n
+ 1][0] != '-')
176 port
= atoi(argv
[++n
]);
180 } else if (!strcmp(argv
[n
], "-1") || !strcmp(argv
[n
], "--solo")) {
181 if (mode
& (CM_SERVER
| CM_CLIENT
| CM_SOLO
)) usage();
185 } else if (!strcmp(argv
[n
], "-n") || !strcmp(argv
[n
], "--name")) {
186 if (!argv
[n
+ 1]) usage();
188 strncpy(player_name
, argv
[++n
], GC_PLAYER_NAME_LENGTH
);
189 player_name
[GC_PLAYER_NAME_LENGTH
- 1] = '\0';
190 for (char *p
= player_name
; *p
; p
++)
191 if (!isprint(*p
)) *p
= ' ';
193 } else if (!strcmp(argv
[n
], "-l") || !strcmp(argv
[n
], "--low"))
195 mode
|= CM_LOW_GRAPHICS
;
197 else if (!strcmp(argv
[n
], "-r") || !strcmp(argv
[n
], "--really")) {
199 mode
|= CM_LOW_GRAPHICS
;
200 mode
|= CM_REALLY_LOW_GRAPHICS
;
202 } else if (!strcmp(argv
[n
], "-X") || !strcmp(argv
[n
], "--extreme"))
206 else if (!strcmp(argv
[n
], "-w") || !strcmp(argv
[n
], "--wait"))
207 mode
|= CM_NO_TIME_OUT
;
209 else if (!strcmp(argv
[n
], "--hard")) {
213 } else if (!strcmp(argv
[n
], "--easy")) {
217 } else if (!strcmp(argv
[n
], "--medium")) {
219 mode
|= CM_AI_MEDIUM
;
221 } else if (!strcmp(argv
[n
], "--res")) {
222 if (argv
[n
+ 1] && argv
[n
+ 1][0] != '-')
223 height
= width
= atoi(argv
[++n
]);
228 if (mode
& (CM_SERVER
| CM_CLIENT
| CM_SOLO
)) usage();
231 strncpy(host_name
, argv
[n
], GC_HOST_NAME_SIZE
);
234 port
= atoi(argv
[n
]);
237 cerr
<< "No port specified.\n";
243 if (!(mode
& (CM_SERVER
| CM_CLIENT
| CM_SOLO
)))
246 if ((mode
& CM_NO_TIME_OUT
) && !(mode
& CM_SERVER
))
249 if ((mode
& CM_REALLY_LOW_GRAPHICS
) && !(mode
& CM_LOW_GRAPHICS
))
252 if ((mode
& CM_AI
&& (mode
& CM_X
)))
256 void setupLocalDataDirectory ( )
258 char local_directory
[256];
259 TextureLoader::buildLocalDataDirectoryName(local_directory
);
260 if (!TextureLoader::fileExists(local_directory
)
262 && mkdir(local_directory
, 0777)
265 && _mkdir(local_directory
)
269 cerr
<< "Error creating local data directory '" << local_directory