ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/init.C
(Generate patch)

Comparing deliantra/server/server/init.C (file contents):
Revision 1.5 by root, Wed Aug 30 16:30:37 2006 UTC vs.
Revision 1.18 by root, Sat Dec 16 17:16:52 2006 UTC

1/*
2 * static char *rcsid_init_c =
3 * "$Id: init.C,v 1.5 2006/08/30 16:30:37 root Exp $";
4 */
5
6/* 1/*
7 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
8 3
9 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
10 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
21 16
22 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 20
26 The authors can be reached via e-mail at crossfire-devel@real-time.com 21 The authors can be reached via e-mail at <crossfire@schmorp.de>
27*/ 22*/
28 23
29#include <global.h> 24#include <global.h>
30#include <material.h> 25#include <material.h>
31#include <loader.h> 26#include <loader.h>
32#ifndef __CEXTRACT__ 27#ifndef __CEXTRACT__
33#include <sproto.h> 28# include <sproto.h>
34#endif 29#endif
35 30
36/* global weathermap */ 31/* global weathermap */
37weathermap_t **weathermap; 32weathermap_t **weathermap;
38 33
39void set_logfile(char *val) { settings.logfilename=val; } 34void
40void call_version(void) { version(NULL); exit(0); } 35set_logfile (char *val)
41void showscores(void) { display_high_score(NULL,9999,NULL); exit(0); } 36{
42void set_debug(void) { settings.debug=llevDebug; } 37 settings.logfilename = val;
43void unset_debug(void) { settings.debug=llevInfo; } 38}
44void set_mondebug(void) { settings.debug=llevMonster; }
45void set_dumpmon1(void) {settings.dumpvalues=1; }
46void set_dumpmon2(void) {settings.dumpvalues=2; }
47void set_dumpmon3(void) {settings.dumpvalues=3; }
48void set_dumpmon4(void) {settings.dumpvalues=4; }
49void set_dumpmon5(void) {settings.dumpvalues=5; }
50void set_dumpmon6(void) {settings.dumpvalues=6; }
51void set_dumpmon7(void) {settings.dumpvalues=7; }
52void set_dumpmon8(void) {settings.dumpvalues=8; }
53void set_dumpmon9(void) {settings.dumpvalues=9; }
54void set_dumpmont(char *name) {settings.dumpvalues=10; settings.dumparg=name; }
55void set_daemon(void) {settings.daemonmode=1; }
56void set_datadir(char *path) { settings.datadir=path; }
57void set_confdir(char *path) { settings.confdir=path; }
58void set_localdir(char *path) { settings.localdir=path; }
59void set_mapdir(char *path) { settings.mapdir=path; }
60void set_archetypes(char *path) { settings.archetypes=path; }
61void set_regions(char *path) { settings.regions=path; }
62void set_treasures(char *path) { settings.treasures=path; }
63void set_uniquedir(char *path) { settings.uniquedir=path; }
64void set_templatedir(char *path) { settings.templatedir=path; }
65void set_playerdir(char *path) { settings.playerdir=path; }
66void set_tmpdir(char *path) { settings.tmpdir=path; }
67 39
40void
41call_version (void)
42{
43 version (NULL);
44 exit (0);
45}
46
47void
48showscores (void)
49{
50 display_high_score (NULL, 9999, NULL);
51 exit (0);
52}
53
54void
55set_debug (void)
56{
57 settings.debug = llevDebug;
58}
59
60void
61unset_debug (void)
62{
63 settings.debug = llevInfo;
64}
65
66void
67set_mondebug (void)
68{
69 settings.debug = llevMonster;
70}
71
72void
73set_dumpmon1 (void)
74{
75 settings.dumpvalues = 1;
76}
77
78void
79set_dumpmon2 (void)
80{
81 settings.dumpvalues = 2;
82}
83
84void
85set_dumpmon3 (void)
86{
87 settings.dumpvalues = 3;
88}
89
90void
91set_dumpmon4 (void)
92{
93 settings.dumpvalues = 4;
94}
95
96void
97set_dumpmon5 (void)
98{
99 settings.dumpvalues = 5;
100}
101
102void
103set_dumpmon6 (void)
104{
105 settings.dumpvalues = 6;
106}
107
108void
109set_dumpmon7 (void)
110{
111 settings.dumpvalues = 7;
112}
113
114void
115set_dumpmon8 (void)
116{
117 settings.dumpvalues = 8;
118}
119
120void
121set_dumpmon9 (void)
122{
123 settings.dumpvalues = 9;
124}
125
126void
127set_dumpmont (char *name)
128{
129 settings.dumpvalues = 10;
130 settings.dumparg = name;
131}
132
133void
134set_daemon (void)
135{
136 settings.daemonmode = 1;
137}
138
139void
140set_datadir (char *path)
141{
142 settings.datadir = path;
143}
144
145void
146set_confdir (char *path)
147{
148 settings.confdir = path;
149}
150
151void
152set_localdir (char *path)
153{
154 settings.localdir = path;
155}
156
157void
158set_mapdir (char *path)
159{
160 settings.mapdir = path;
161}
162
163void
164set_archetypes (char *path)
165{
166 settings.archetypes = path;
167}
168
169void
170set_regions (char *path)
171{
172 settings.regions = path;
173}
174
175void
176set_treasures (char *path)
177{
178 settings.treasures = path;
179}
180
181void
182set_uniquedir (char *path)
183{
184 settings.uniquedir = path;
185}
186
187void
188set_templatedir (char *path)
189{
190 settings.templatedir = path;
191}
192
193void
194set_playerdir (char *path)
195{
196 settings.playerdir = path;
197}
198
199void
200set_tmpdir (char *path)
201{
202 settings.tmpdir = path;
203}
204
205void
68void showscoresparm(char *data) { 206showscoresparm (char *data)
207{
69 display_high_score(NULL,9999,data); 208 display_high_score (NULL, 9999, data);
70 exit(0); 209 exit (0);
71} 210}
72 211
212void
73void set_csport(char *val) 213set_csport (char *val)
74{ 214{
75 settings.csport=atoi(val); 215 settings.csport = atoi (val);
76#ifndef WIN32 /* ***win32: set_csport: we remove csport error secure check here, do this later */ 216 if (settings.csport <= 0 || settings.csport > 32765 || (settings.csport < 1024 && getuid () != 0))
77 if (settings.csport<=0 || settings.csport>32765 || 217 {
78 (settings.csport<1024 && getuid()!=0)) {
79 LOG(llevError, "%d is an invalid csport number.\n", settings.csport); 218 LOG (llevError, "%d is an invalid csport number.\n", settings.csport);
80 exit(1); 219 exit (1);
81 } 220 }
82#endif /* win32 */
83} 221}
84 222
85/* Most of this is shamelessly stolen from XSysStats. But since that is 223/* Most of this is shamelessly stolen from XSysStats. But since that is
86 * also my program, no problem. 224 * also my program, no problem.
87 */ 225 */
88struct Command_Line_Options { 226struct Command_Line_Options
227{
89 const char *cmd_option; /* how it is called on the command line */ 228 const char *cmd_option; /* how it is called on the command line */
90 uint8 num_args; /* Number or args it takes */ 229 uint8 num_args; /* Number or args it takes */
91 uint8 pass; /* What pass this should be processed on. */ 230 uint8 pass; /* What pass this should be processed on. */
92 void (*func)(); /* function to call when we match this. 231 void (*func) (); /* function to call when we match this.
93 * if num_args is true, than that gets passed 232 * if num_args is true, than that gets passed
94 * to the function, otherwise nothing is passed 233 * to the function, otherwise nothing is passed
95 */ 234 */
96}; 235};
97 236
98/* The way this system works is pretty simple - parse_args takes 237/* The way this system works is pretty simple - parse_args takes
99 * the options passed to the program and a pass number. If an option 238 * the options passed to the program and a pass number. If an option
100 * matches both in name and in pass (and we have enough options), 239 * matches both in name and in pass (and we have enough options),
104struct Command_Line_Options options[] = { 243struct Command_Line_Options options[] = {
105 244
106/* Pass 1 functions - STuff that can/should be called before we actually 245/* Pass 1 functions - STuff that can/should be called before we actually
107 * initialize any data. 246 * initialize any data.
108 */ 247 */
109{"-h", 0, 1, help}, 248 {"-h", 0, 1, help},
249
110/* Honor -help also, since it is somewhat common */ 250/* Honor -help also, since it is somewhat common */
111{"-help", 0, 1, help}, 251 {"-help", 0, 1, help},
112{"-v", 0, 1, call_version}, 252 {"-v", 0, 1, call_version},
113{"-d", 0, 1, set_debug}, 253 {"-d", 0, 1, set_debug},
114{"+d", 0, 1, unset_debug}, 254 {"+d", 0, 1, unset_debug},
115{"-mon", 0, 1, set_mondebug}, 255 {"-mon", 0, 1, set_mondebug},
116{"-data",1,1, (void (*)())set_datadir}, 256 {"-data", 1, 1, (void (*)()) set_datadir},
117{"-conf",1,1, (void (*)())set_confdir}, 257 {"-conf", 1, 1, (void (*)()) set_confdir},
118{"-local",1,1,(void (*)()) set_localdir}, 258 {"-local", 1, 1, (void (*)()) set_localdir},
119{"-maps", 1, 1,(void (*)()) set_mapdir}, 259 {"-maps", 1, 1, (void (*)()) set_mapdir},
120{"-arch", 1, 1,(void (*)()) set_archetypes}, 260 {"-arch", 1, 1, (void (*)()) set_archetypes},
121{"-regions", 1, 1,(void (*)()) set_regions}, 261 {"-regions", 1, 1, (void (*)()) set_regions},
122{"-playerdir", 1, 1,(void (*)()) set_playerdir}, 262 {"-playerdir", 1, 1, (void (*)()) set_playerdir},
123{"-treasures", 1, 1,(void (*)()) set_treasures}, 263 {"-treasures", 1, 1, (void (*)()) set_treasures},
124{"-uniquedir", 1, 1,(void (*)()) set_uniquedir}, 264 {"-uniquedir", 1, 1, (void (*)()) set_uniquedir},
125{"-templatedir", 1, 1,(void (*)()) set_templatedir}, 265 {"-templatedir", 1, 1, (void (*)()) set_templatedir},
126{"-tmpdir", 1, 1,(void (*)()) set_tmpdir}, 266 {"-tmpdir", 1, 1, (void (*)()) set_tmpdir},
127{"-log", 1, 1,(void (*)()) set_logfile}, 267 {"-log", 1, 1, (void (*)()) set_logfile},
128
129#ifdef WIN32
130/* Windows service stuff */
131{"-regsrv", 0, 1, service_register},
132{"-unregsrv", 0, 1, service_unregister},
133{"-srv", 0, 1, service_handle},
134#endif
135 268
136/* Pass 2 functions. Most of these could probably be in pass 1, 269/* Pass 2 functions. Most of these could probably be in pass 1,
137 * as they don't require much of anything to bet set up. 270 * as they don't require much of anything to bet set up.
138 */ 271 */
139{"-csport", 1, 2,(void (*)()) set_csport}, 272 {"-csport", 1, 2, (void (*)()) set_csport},
140{"-detach", 0, 2, set_daemon}, 273 {"-detach", 0, 2, set_daemon},
141 274
142/* Start of pass 3 information. In theory, by pass 3, all data paths 275/* Start of pass 3 information. In theory, by pass 3, all data paths
143 * and defaults should have been set up. 276 * and defaults should have been set up.
144 */ 277 */
145{"-o", 0, 3, compile_info}, 278 {"-o", 0, 3, compile_info},
146{"-m", 0, 3, set_dumpmon1}, 279 {"-m", 0, 3, set_dumpmon1},
147{"-m2", 0, 3, set_dumpmon2}, 280 {"-m2", 0, 3, set_dumpmon2},
148{"-m3", 0, 3, set_dumpmon3}, 281 {"-m3", 0, 3, set_dumpmon3},
149{"-m4", 0, 3, set_dumpmon4}, 282 {"-m4", 0, 3, set_dumpmon4},
150{"-m5", 0, 3, set_dumpmon5}, 283 {"-m5", 0, 3, set_dumpmon5},
151{"-m6", 0, 3, set_dumpmon6}, 284 {"-m6", 0, 3, set_dumpmon6},
152{"-m7", 0, 3, set_dumpmon7}, 285 {"-m7", 0, 3, set_dumpmon7},
153{"-m8", 0, 3, set_dumpmon8}, 286 {"-m8", 0, 3, set_dumpmon8},
154{"-m9", 0, 3, set_dumpmon9}, 287 {"-m9", 0, 3, set_dumpmon9},
155{"-mt", 1, 3, (void (*)())set_dumpmont}, 288 {"-mt", 1, 3, (void (*)()) set_dumpmont},
156{"-mexp", 0, 3, dump_experience}, 289 {"-mexp", 0, 3, dump_experience},
157{"-s", 0, 3, showscores}, 290 {"-s", 0, 3, showscores},
158{"-score", 1, 3, (void (*)())showscoresparm} 291 {"-score", 1, 3, (void (*)()) showscoresparm}
159}; 292};
160 293
161 294
162/* Note since this may be called before the library has been set up, 295/* Note since this may be called before the library has been set up,
163 * we don't use any of crossfires built in logging functions. 296 * we don't use any of crossfires built in logging functions.
164 */ 297 */
298static void
165static void parse_args(int argc, char *argv[], int pass) 299parse_args (int argc, char *argv[], int pass)
166{ 300{
167 size_t i; 301 size_t i;
168 int on_arg=1; 302 int on_arg = 1;
169 303
170 while (on_arg<argc) { 304 while (on_arg < argc)
305 {
171 for (i=0; i<sizeof(options)/sizeof(struct Command_Line_Options); i++) { 306 for (i = 0; i < sizeof (options) / sizeof (struct Command_Line_Options); i++)
307 {
172 if (!strcmp(options[i].cmd_option, argv[on_arg])) { 308 if (!strcmp (options[i].cmd_option, argv[on_arg]))
309 {
173 /* Found a matching option, but should not be processed on 310 /* Found a matching option, but should not be processed on
174 * this pass. Just skip over it 311 * this pass. Just skip over it
175 */ 312 */
176 if (options[i].pass != pass) { 313 if (options[i].pass != pass)
314 {
177 on_arg += options[i].num_args+1; 315 on_arg += options[i].num_args + 1;
178 break; 316 break;
179 } 317 }
180 if (options[i].num_args) { 318 if (options[i].num_args)
319 {
181 if ((on_arg+options[i].num_args)>=argc) { 320 if ((on_arg + options[i].num_args) >= argc)
321 {
182 fprintf(stderr,"%s requires an argument.\n", options[i].cmd_option); 322 fprintf (stderr, "%s requires an argument.\n", options[i].cmd_option);
183 exit(1); 323 exit (1);
184 } 324 }
185 else { 325 else
326 {
186 if (options[i].num_args==1) 327 if (options[i].num_args == 1)
187 ((void (*)(char*))options[i].func)(argv[on_arg+1]); 328 ((void (*)(char *)) options[i].func) (argv[on_arg + 1]);
188 if (options[i].num_args==2) 329 if (options[i].num_args == 2)
189 ((void (*)(char*,char*))options[i].func)(argv[on_arg+1],argv[on_arg+2]); 330 ((void (*)(char *, char *)) options[i].func) (argv[on_arg + 1], argv[on_arg + 2]);
190 on_arg +=options[i].num_args+1; 331 on_arg += options[i].num_args + 1;
191 } 332 }
192 } 333 }
334 else
193 else { /* takes no args */ 335 { /* takes no args */
194 options[i].func(); 336 options[i].func ();
195 on_arg++; 337 on_arg++;
196 } 338 }
197 break; 339 break;
198 }
199 } 340 }
341 }
200 if (i==sizeof(options)/sizeof(struct Command_Line_Options)) { 342 if (i == sizeof (options) / sizeof (struct Command_Line_Options))
343 {
201 fprintf(stderr,"Unknown option: %s\n", argv[on_arg]); 344 fprintf (stderr, "Unknown option: %s\n", argv[on_arg]);
202 usage(); 345 usage ();
203 exit(1); 346 exit (1);
204 } 347 }
205 } 348 }
206} 349}
207 350
208static materialtype_t *get_empty_mat(void) { 351//TODO: make this a constructor
352static materialtype_t *
353get_empty_mat (void)
354{
209 materialtype_t *mt; 355 materialtype_t *mt;
210 int i; 356 int i;
211 357
212 mt = (materialtype_t *)malloc(sizeof(materialtype_t)); 358 mt = new materialtype_t;
213 if (mt == NULL) 359
214 fatal(OUT_OF_MEMORY);
215 mt->name = NULL; 360 mt->name = NULL;
216 mt->description = NULL; 361 mt->description = NULL;
217 for (i=0; i < NROFATTACKS; i++) { 362 for (i = 0; i < NROFATTACKS; i++)
363 {
218 mt->save[i] = 0; 364 mt->save[i] = 0;
219 mt->mod[i] = 0; 365 mt->mod[i] = 0;
220 } 366 }
221 mt->chance = 0; 367 mt->chance = 0;
222 mt->difficulty = 0; 368 mt->difficulty = 0;
223 mt->magic = 0; 369 mt->magic = 0;
224 mt->damage = 0; 370 mt->damage = 0;
225 mt->wc = 0; 371 mt->wc = 0;
226 mt->ac = 0; 372 mt->ac = 0;
227 mt->sp = 0; 373 mt->sp = 0;
228 mt->weight = 100; 374 mt->weight = 100;
229 mt->value = 100; 375 mt->value = 100;
230 mt->next = NULL; 376 mt->next = NULL;
231 return mt; 377 return mt;
232} 378}
233 379
380static void
234static void load_materials(void) 381load_materials (void)
235{ 382{
236 char buf[MAX_BUF], filename[MAX_BUF], *cp, *next; 383 char buf[MAX_BUF], filename[MAX_BUF], *cp, *next;
237 FILE *fp; 384 FILE *fp;
238 materialtype_t *mt; 385 materialtype_t *mt;
239 int i, value; 386 int i, value;
240 387
241 sprintf(filename, "%s/materials", settings.datadir); 388 sprintf (filename, "%s/materials", settings.datadir);
242 LOG(llevDebug, "Reading material type data from %s...", filename); 389 LOG (llevDebug, "Reading material type data from %s...", filename);
243 if ((fp = fopen(filename, "r")) == NULL) { 390 if ((fp = fopen (filename, "r")) == NULL)
391 {
244 LOG(llevError, "Cannot open %s for reading\n", filename); 392 LOG (llevError, "Cannot open %s for reading\n", filename);
245 mt = get_empty_mat(); 393 mt = get_empty_mat ();
246 mt->next = NULL; 394 mt->next = NULL;
247 materialt = mt; 395 materialt = mt;
248 return; 396 return;
249 } 397 }
250 mt = get_empty_mat(); 398 mt = get_empty_mat ();
251 materialt = mt; 399 materialt = mt;
252 while (fgets(buf, MAX_BUF, fp) != NULL) { 400 while (fgets (buf, MAX_BUF, fp) != NULL)
401 {
253 if (*buf=='#') 402 if (*buf == '#')
254 continue; 403 continue;
255 if ((cp=strchr(buf, '\n'))!=NULL) 404 if ((cp = strchr (buf, '\n')) != NULL)
256 *cp='\0'; 405 *cp = '\0';
257 cp=buf; 406 cp = buf;
258 while(*cp==' ') /* Skip blanks */ 407 while (*cp == ' ') /* Skip blanks */
259 cp++; 408 cp++;
260 if (!strncmp(cp, "name", 4)) { 409 if (!strncmp (cp, "name", 4))
410 {
261 /* clean up the previous entry */ 411 /* clean up the previous entry */
262 if (mt->next != NULL) { 412 if (mt->next != NULL)
413 {
263 if (mt->description == NULL) 414 if (mt->description == NULL)
264 mt->description = add_string(mt->name); 415 mt->description = mt->name;
265 mt = mt->next; 416 mt = mt->next;
266 } 417 }
267 mt->next = get_empty_mat(); 418 mt->next = get_empty_mat ();
268 mt->name = add_string(strchr(cp, ' ') + 1); 419 mt->name = strchr (cp, ' ') + 1;
420 }
269 } else if (!strncmp(cp, "description", 11)) { 421 else if (!strncmp (cp, "description", 11))
422 {
270 mt->description = add_string(strchr(cp, ' ') + 1); 423 mt->description = strchr (cp, ' ') + 1;
424 }
271 } else if (sscanf(cp, "material %d", &value)) { 425 else if (sscanf (cp, "material %d", &value))
426 {
272 mt->material = value; 427 mt->material = value;
428 }
273 } else if (!strncmp(cp, "saves", 5)) { 429 else if (!strncmp (cp, "saves", 5))
430 {
274 cp = strchr(cp, ' ') + 1; 431 cp = strchr (cp, ' ') + 1;
275 for (i=0; i < NROFATTACKS; i++) { 432 for (i = 0; i < NROFATTACKS; i++)
433 {
276 if (cp == NULL) { 434 if (cp == NULL)
435 {
277 mt->save[i] = 0; 436 mt->save[i] = 0;
278 continue; 437 continue;
279 } 438 }
280 if ((next=strchr(cp,',')) != NULL) 439 if ((next = strchr (cp, ',')) != NULL)
281 *(next++) = '\0'; 440 *(next++) = '\0';
282 sscanf(cp, "%d", &value); 441 sscanf (cp, "%d", &value);
283 mt->save[i] = (sint8)value; 442 mt->save[i] = (sint8) value;
284 cp = next; 443 cp = next;
444 }
285 } 445 }
286 } else if (!strncmp(cp, "mods", 4)) { 446 else if (!strncmp (cp, "mods", 4))
447 {
287 cp = strchr(cp, ' ') + 1; 448 cp = strchr (cp, ' ') + 1;
288 for (i=0; i < NROFATTACKS; i++) { 449 for (i = 0; i < NROFATTACKS; i++)
450 {
289 if (cp == NULL) { 451 if (cp == NULL)
452 {
290 mt->save[i] = 0; 453 mt->save[i] = 0;
291 continue; 454 continue;
292 }
293 if ((next=strchr(cp,',')) != NULL)
294 *(next++) = '\0';
295 sscanf(cp, "%d", &value);
296 mt->mod[i] = (sint8)value;
297 cp = next;
298 } 455 }
456 if ((next = strchr (cp, ',')) != NULL)
457 *(next++) = '\0';
458 sscanf (cp, "%d", &value);
459 mt->mod[i] = (sint8) value;
460 cp = next;
461 }
462 }
299 } else if (sscanf(cp, "chance %d\n", &value)) { 463 else if (sscanf (cp, "chance %d\n", &value))
464 {
300 mt->chance = (sint8)value; 465 mt->chance = (sint8) value;
466 }
301 } else if (sscanf(cp, "diff %d\n", &value)) { 467 else if (sscanf (cp, "diff %d\n", &value))
468 {
302 mt->difficulty = (sint8)value; 469 mt->difficulty = (sint8) value;
470 }
303 } else if (sscanf(cp, "magic %d\n", &value)) { 471 else if (sscanf (cp, "magic %d\n", &value))
472 {
304 mt->magic = (sint8)value; 473 mt->magic = (sint8) value;
474 }
305 } else if (sscanf(cp, "damage %d\n", &value)) { 475 else if (sscanf (cp, "damage %d\n", &value))
476 {
306 mt->damage= (sint8)value; 477 mt->damage = (sint8) value;
478 }
307 } else if (sscanf(cp, "wc %d\n", &value)) { 479 else if (sscanf (cp, "wc %d\n", &value))
480 {
308 mt->wc = (sint8)value; 481 mt->wc = (sint8) value;
482 }
309 } else if (sscanf(cp, "ac %d\n", &value)) { 483 else if (sscanf (cp, "ac %d\n", &value))
484 {
310 mt->ac = (sint8)value; 485 mt->ac = (sint8) value;
486 }
311 } else if (sscanf(cp, "sp %d\n", &value)) { 487 else if (sscanf (cp, "sp %d\n", &value))
488 {
312 mt->sp = (sint8)value; 489 mt->sp = (sint8) value;
490 }
313 } else if (sscanf(cp, "weight %d\n", &value)) { 491 else if (sscanf (cp, "weight %d\n", &value))
492 {
314 mt->weight = value; 493 mt->weight = value;
494 }
315 } else if (sscanf(cp, "value %d\n", &value)) { 495 else if (sscanf (cp, "value %d\n", &value))
496 {
316 mt->value = value; 497 mt->value = value;
317 } 498 }
318 } 499 }
319 if (mt->next) 500 if (mt->next)
320 { 501 {
321 free(mt->next); 502 delete mt->next;
503
322 mt->next = NULL; 504 mt->next = NULL;
323 } 505 }
324 LOG(llevDebug, "Done.\n"); 506 LOG (llevDebug, "Done.\n");
325 fclose(fp); 507 fclose (fp);
326} 508}
327 509
328/* This loads the settings file. There could be debate whether this should 510/* This loads the settings file. There could be debate whether this should
329 * be here or in the common directory - but since only the server needs this 511 * be here or in the common directory - but since only the server needs this
330 * information, having it here probably makes more sense. 512 * information, having it here probably makes more sense.
331 */ 513 */
332static void load_settings(void) 514static void
515load_settings (void)
333{ 516{
334 char buf[MAX_BUF],*cp; 517 char buf[MAX_BUF], *cp;
335 int has_val,comp; 518 int has_val, comp;
336 FILE *fp; 519 FILE *fp;
337 520
338 sprintf(buf,"%s/settings",settings.confdir); 521 sprintf (buf, "%s/settings", settings.confdir);
339 522
340 /* We don't require a settings file at current time, but down the road, 523 /* We don't require a settings file at current time, but down the road,
341 * there will probably be so many values that not having a settings file 524 * there will probably be so many values that not having a settings file
342 * will not be a good thing. 525 * will not be a good thing.
343 */ 526 */
344 if ((fp = open_and_uncompress(buf, 0, &comp)) == NULL) { 527 if ((fp = open_and_uncompress (buf, 0, &comp)) == NULL)
528 {
345 LOG(llevError,"Warning: No settings file found\n"); 529 LOG (llevError, "Warning: No settings file found\n");
346 return; 530 return;
347 } 531 }
348 while (fgets(buf, MAX_BUF-1, fp) != NULL) { 532 while (fgets (buf, MAX_BUF - 1, fp) != NULL)
533 {
349 if (buf[0] == '#') continue; 534 if (buf[0] == '#')
535 continue;
350 /* eliminate newline */ 536 /* eliminate newline */
351 if ((cp=strrchr(buf,'\n'))!=NULL) *cp='\0'; 537 if ((cp = strrchr (buf, '\n')) != NULL)
538 *cp = '\0';
352 539
353 /* Skip over empty lines */ 540 /* Skip over empty lines */
354 if (buf[0] == 0) continue; 541 if (buf[0] == 0)
542 continue;
355 543
356 /* Skip all the spaces and set them to nulls. If not space, 544 /* Skip all the spaces and set them to nulls. If not space,
357 * set cp to "" to make strcpy's and the like easier down below. 545 * set cp to "" to make strcpy's and the like easier down below.
358 */ 546 */
359 if ((cp = strchr(buf,' '))!=NULL) { 547 if ((cp = strchr (buf, ' ')) != NULL)
548 {
360 while (*cp==' ') *cp++=0; 549 while (*cp == ' ')
550 *cp++ = 0;
361 has_val=1; 551 has_val = 1;
552 }
362 } else { 553 else
554 {
363 cp=""; 555 cp = "";
364 has_val=0; 556 has_val = 0;
557 }
558
559 if (!strcasecmp (buf, "motd"))
365 } 560 {
366
367 if (!strcasecmp(buf,"metaserver_notification")) {
368 if (!strcasecmp(cp,"on") || !strcasecmp(cp,"true")) {
369 settings.meta_on=TRUE;
370 } else if (!strcasecmp(cp,"off") || !strcasecmp(cp,"false")) {
371 settings.meta_on=FALSE;
372 } else {
373 LOG(llevError,"load_settings: Unknown value for metaserver_notification: %s\n",
374 cp);
375 }
376 } else if (!strcasecmp(buf,"metaserver_server")) {
377 if (has_val) strcpy(settings.meta_server, cp);
378 else
379 LOG(llevError,"load_settings: metaserver_server must have a value.\n");
380 } else if (!strcasecmp(buf,"motd")) {
381 if (has_val) 561 if (has_val)
382 strcpy(settings.motd, cp); 562 strcpy (settings.motd, cp);
383 else 563 else
384 LOG(llevError,"load_settings: motd must have a value.\n"); 564 LOG (llevError, "load_settings: motd must have a value.\n");
565 }
385 } else if (!strcasecmp(buf,"dm_mail")) { 566 else if (!strcasecmp (buf, "dm_mail"))
567 {
386 if (has_val) 568 if (has_val)
387 strcpy(settings.dm_mail, cp); 569 strcpy (settings.dm_mail, cp);
388 else 570 else
389 LOG(llevError,"load_settings: dm_mail must have a value.\n"); 571 LOG (llevError, "load_settings: dm_mail must have a value.\n");
390 } else if (!strcasecmp(buf,"metaserver_host")) { 572 }
391 if (has_val) strcpy(settings.meta_host, cp);
392 else
393 LOG(llevError,"load_settings: metaserver_host must have a value.\n");
394 } else if (!strcasecmp(buf,"metaserver_port")) {
395 int port = atoi(cp);
396
397 if (port<1 || port>65535)
398 LOG(llevError,"load_settings: metaserver_port must be between 1 and 65535, %d is invalid\n",
399 port);
400 else settings.meta_port = port;
401 } else if (!strcasecmp(buf,"metaserver_comment")) {
402 strcpy(settings.meta_comment, cp);
403 } else if (!strcasecmp(buf, "worldmapstartx")) { 573 else if (!strcasecmp (buf, "worldmapstartx"))
574 {
404 int size = atoi(cp); 575 int size = atoi (cp);
405 576
406 if (size < 0) 577 if (size < 0)
407 LOG(llevError, "load_settings: worldmapstartx must be at least " 578 LOG (llevError, "load_settings: worldmapstartx must be at least " "0, %d is invalid\n", size);
408 "0, %d is invalid\n", size);
409 else 579 else
410 settings.worldmapstartx = size; 580 settings.worldmapstartx = size;
581 }
411 } else if (!strcasecmp(buf, "worldmapstarty")) { 582 else if (!strcasecmp (buf, "worldmapstarty"))
583 {
412 int size = atoi(cp); 584 int size = atoi (cp);
413 585
414 if (size < 0) 586 if (size < 0)
415 LOG(llevError, "load_settings: worldmapstarty must be at least " 587 LOG (llevError, "load_settings: worldmapstarty must be at least " "0, %d is invalid\n", size);
416 "0, %d is invalid\n", size);
417 else 588 else
418 settings.worldmapstarty = size; 589 settings.worldmapstarty = size;
590 }
419 } else if (!strcasecmp(buf, "worldmaptilesx")) { 591 else if (!strcasecmp (buf, "worldmaptilesx"))
592 {
420 int size = atoi(cp); 593 int size = atoi (cp);
421 594
422 if (size < 1) 595 if (size < 1)
423 LOG(llevError, "load_settings: worldmaptilesx must be greater " 596 LOG (llevError, "load_settings: worldmaptilesx must be greater " "than 1, %d is invalid\n", size);
424 "than 1, %d is invalid\n", size);
425 else 597 else
426 settings.worldmaptilesx = size; 598 settings.worldmaptilesx = size;
599 }
427 } else if (!strcasecmp(buf, "worldmaptilesy")) { 600 else if (!strcasecmp (buf, "worldmaptilesy"))
601 {
428 int size = atoi(cp); 602 int size = atoi (cp);
429 603
430 if (size < 1) 604 if (size < 1)
431 LOG(llevError, "load_settings: worldmaptilesy must be greater " 605 LOG (llevError, "load_settings: worldmaptilesy must be greater " "than 1, %d is invalid\n", size);
432 "than 1, %d is invalid\n", size);
433 else 606 else
434 settings.worldmaptilesy = size; 607 settings.worldmaptilesy = size;
608 }
435 } else if (!strcasecmp(buf, "worldmaptilesizex")) { 609 else if (!strcasecmp (buf, "worldmaptilesizex"))
610 {
436 int size = atoi(cp); 611 int size = atoi (cp);
437 612
438 if (size < 1) 613 if (size < 1)
439 LOG(llevError, "load_settings: worldmaptilesizex must be " 614 LOG (llevError, "load_settings: worldmaptilesizex must be " "greater than 1, %d is invalid\n", size);
440 "greater than 1, %d is invalid\n", size);
441 else 615 else
442 settings.worldmaptilesizex = size; 616 settings.worldmaptilesizex = size;
617 }
443 } else if (!strcasecmp(buf, "worldmaptilesizey")) { 618 else if (!strcasecmp (buf, "worldmaptilesizey"))
619 {
444 int size = atoi(cp); 620 int size = atoi (cp);
445 621
446 if (size < 1) 622 if (size < 1)
447 LOG(llevError, "load_settings: worldmaptilesizey must be " 623 LOG (llevError, "load_settings: worldmaptilesizey must be " "greater than 1, %d is invalid\n", size);
448 "greater than 1, %d is invalid\n", size);
449 else 624 else
450 settings.worldmaptilesizey = size; 625 settings.worldmaptilesizey = size;
626 }
451 } else if (!strcasecmp(buf, "dynamiclevel")) { 627 else if (!strcasecmp (buf, "dynamiclevel"))
628 {
452 int lev = atoi(cp); 629 int lev = atoi (cp);
453 630
454 if (lev < 0) 631 if (lev < 0)
455 LOG(llevError, "load_settings: dynamiclevel must be " 632 LOG (llevError, "load_settings: dynamiclevel must be " "at least 0, %d is invalid\n", lev);
456 "at least 0, %d is invalid\n", lev);
457 else 633 else
458 settings.dynamiclevel = lev; 634 settings.dynamiclevel = lev;
635 }
459 } else if (!strcasecmp(buf, "fastclock")) { 636 else if (!strcasecmp (buf, "fastclock"))
637 {
460 int lev = atoi(cp); 638 int lev = atoi (cp);
461 639
462 if (lev < 0) 640 if (lev < 0)
463 LOG(llevError, "load_settings: fastclock must be at least 0" 641 LOG (llevError, "load_settings: fastclock must be at least 0" ", %d is invalid\n", lev);
464 ", %d is invalid\n", lev);
465 else 642 else
466 settings.fastclock = lev; 643 settings.fastclock = lev;
644 }
467 } else if (!strcasecmp(buf, "not_permadeth")) { 645 else if (!strcasecmp (buf, "not_permadeth"))
646 {
468 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 647 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
648 {
469 settings.not_permadeth=TRUE; 649 settings.not_permadeth = TRUE;
650 }
470 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 651 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
652 {
471 settings.not_permadeth=FALSE; 653 settings.not_permadeth = FALSE;
654 }
472 } else { 655 else
473 LOG(llevError, "load_settings: Unknown value for not_permadeth"
474 ": %s\n", cp);
475 } 656 {
657 LOG (llevError, "load_settings: Unknown value for not_permadeth" ": %s\n", cp);
658 }
659 }
476 } else if (!strcasecmp(buf, "resurrection")) { 660 else if (!strcasecmp (buf, "resurrection"))
661 {
477 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 662 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
663 {
478 settings.resurrection=TRUE; 664 settings.resurrection = TRUE;
665 }
479 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 666 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
667 {
480 settings.resurrection=FALSE; 668 settings.resurrection = FALSE;
669 }
481 } else { 670 else
482 LOG(llevError, "load_settings: Unknown value for resurrection"
483 ": %s\n", cp);
484 } 671 {
672 LOG (llevError, "load_settings: Unknown value for resurrection" ": %s\n", cp);
673 }
674 }
485 } else if (!strcasecmp(buf, "set_title")) { 675 else if (!strcasecmp (buf, "set_title"))
676 {
486 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 677 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
678 {
487 settings.set_title=TRUE; 679 settings.set_title = TRUE;
680 }
488 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 681 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
682 {
489 settings.set_title=FALSE; 683 settings.set_title = FALSE;
684 }
490 } else { 685 else
491 LOG(llevError, "load_settings: Unknown value for set_title"
492 ": %s\n", cp);
493 } 686 {
687 LOG (llevError, "load_settings: Unknown value for set_title" ": %s\n", cp);
688 }
689 }
494 } else if (!strcasecmp(buf, "search_items")) { 690 else if (!strcasecmp (buf, "search_items"))
691 {
495 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 692 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
693 {
496 settings.search_items=TRUE; 694 settings.search_items = TRUE;
695 }
497 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 696 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
697 {
498 settings.search_items=FALSE; 698 settings.search_items = FALSE;
699 }
499 } else { 700 else
500 LOG(llevError, "load_settings: Unknown value for search_items"
501 ": %s\n", cp);
502 } 701 {
702 LOG (llevError, "load_settings: Unknown value for search_items" ": %s\n", cp);
703 }
704 }
503 } else if (!strcasecmp(buf, "spell_encumbrance")) { 705 else if (!strcasecmp (buf, "spell_encumbrance"))
706 {
504 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 707 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
708 {
505 settings.spell_encumbrance=TRUE; 709 settings.spell_encumbrance = TRUE;
710 }
506 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 711 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
712 {
507 settings.spell_encumbrance=FALSE; 713 settings.spell_encumbrance = FALSE;
714 }
508 } else { 715 else
509 LOG(llevError, "load_settings: Unknown value for "
510 "spell_encumbrance: %s\n", cp);
511 } 716 {
717 LOG (llevError, "load_settings: Unknown value for " "spell_encumbrance: %s\n", cp);
718 }
719 }
512 } else if (!strcasecmp(buf, "spell_failure_effects")) { 720 else if (!strcasecmp (buf, "spell_failure_effects"))
721 {
513 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 722 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
723 {
514 settings.spell_failure_effects=TRUE; 724 settings.spell_failure_effects = TRUE;
725 }
515 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 726 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
727 {
516 settings.spell_failure_effects=FALSE; 728 settings.spell_failure_effects = FALSE;
729 }
517 } else { 730 else
518 LOG(llevError, "load_settings: Unknown value for "
519 "spell_failure_effects: %s\n", cp);
520 } 731 {
732 LOG (llevError, "load_settings: Unknown value for " "spell_failure_effects: %s\n", cp);
733 }
734 }
521 } else if (!strcasecmp(buf, "casting_time")) { 735 else if (!strcasecmp (buf, "casting_time"))
736 {
522 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 737 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
738 {
523 settings.casting_time=TRUE; 739 settings.casting_time = TRUE;
740 }
524 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 741 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
742 {
525 settings.casting_time=FALSE; 743 settings.casting_time = FALSE;
744 }
526 } else { 745 else
527 LOG(llevError, "load_settings: Unknown value for "
528 "casting_time: %s\n", cp);
529 } 746 {
747 LOG (llevError, "load_settings: Unknown value for " "casting_time: %s\n", cp);
748 }
749 }
530 } else if (!strcasecmp(buf, "real_wiz")) { 750 else if (!strcasecmp (buf, "real_wiz"))
751 {
531 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 752 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
753 {
532 settings.real_wiz=TRUE; 754 settings.real_wiz = TRUE;
755 }
533 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 756 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
757 {
534 settings.real_wiz=FALSE; 758 settings.real_wiz = FALSE;
759 }
535 } else { 760 else
536 LOG(llevError, "load_settings: Unknown value for "
537 "real_wiz: %s\n", cp);
538 } 761 {
762 LOG (llevError, "load_settings: Unknown value for " "real_wiz: %s\n", cp);
763 }
764 }
539 } else if (!strcasecmp(buf, "recycle_tmp_maps")) { 765 else if (!strcasecmp (buf, "recycle_tmp_maps"))
766 {
540 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 767 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
768 {
541 settings.recycle_tmp_maps=TRUE; 769 settings.recycle_tmp_maps = TRUE;
770 }
542 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 771 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
772 {
543 settings.recycle_tmp_maps=FALSE; 773 settings.recycle_tmp_maps = FALSE;
774 }
544 } else { 775 else
545 LOG(llevError, "load_settings: Unknown value for "
546 "recycle_tmp_maps: %s\n", cp);
547 } 776 {
777 LOG (llevError, "load_settings: Unknown value for " "recycle_tmp_maps: %s\n", cp);
778 }
779 }
548 } else if (!strcasecmp(buf, "explore_mode")) { 780 else if (!strcasecmp (buf, "explore_mode"))
781 {
549 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 782 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
783 {
550 settings.explore_mode=TRUE; 784 settings.explore_mode = TRUE;
785 }
551 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 786 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
787 {
552 settings.explore_mode=FALSE; 788 settings.explore_mode = FALSE;
789 }
553 } else { 790 else
554 LOG(llevError, "load_settings: Unknown value for "
555 "explore_mode: %s\n", cp);
556 } 791 {
557 } else if (!strcasecmp(buf,"who_format")) { 792 LOG (llevError, "load_settings: Unknown value for " "explore_mode: %s\n", cp);
558 if (has_val) 793 }
559 strcpy(settings.who_format, cp); 794 }
560 } else if (!strcasecmp(buf,"who_wiz_format")) {
561 if (has_val)
562 strcpy(settings.who_wiz_format, cp);
563 } else if (!strcasecmp(buf, "spellpoint_level_depend")) { 795 else if (!strcasecmp (buf, "spellpoint_level_depend"))
796 {
564 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 797 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
798 {
565 settings.spellpoint_level_depend=TRUE; 799 settings.spellpoint_level_depend = TRUE;
800 }
566 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 801 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
802 {
567 settings.spellpoint_level_depend=FALSE; 803 settings.spellpoint_level_depend = FALSE;
804 }
568 } else { 805 else
569 LOG(llevError, "load_settings: Unknown value for "
570 "spellpoint_level_depend: %s\n", cp);
571 } 806 {
807 LOG (llevError, "load_settings: Unknown value for " "spellpoint_level_depend: %s\n", cp);
808 }
809 }
572 } else if (!strcasecmp(buf, "stat_loss_on_death")) { 810 else if (!strcasecmp (buf, "stat_loss_on_death"))
811 {
573 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 812 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
813 {
574 settings.stat_loss_on_death=TRUE; 814 settings.stat_loss_on_death = TRUE;
815 }
575 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 816 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
817 {
576 settings.stat_loss_on_death=FALSE; 818 settings.stat_loss_on_death = FALSE;
819 }
577 } else { 820 else
578 LOG(llevError, "load_settings: Unknown value for "
579 "stat_loss_on_death: %s\n", cp);
580 } 821 {
822 LOG (llevError, "load_settings: Unknown value for " "stat_loss_on_death: %s\n", cp);
823 }
824 }
581 } else if (!strcasecmp(buf, "use_permanent_experience")) { 825 else if (!strcasecmp (buf, "use_permanent_experience"))
582 LOG(llevError, "use_permanent_experience is deprecated, use" 826 {
583 "permenent_experience_percentage instead\n"); 827 LOG (llevError, "use_permanent_experience is deprecated, use" "permenent_experience_percentage instead\n");
828 }
584 } else if (!strcasecmp(buf, "permanent_experience_percentage")) { 829 else if (!strcasecmp (buf, "permanent_experience_percentage"))
830 {
585 int val = atoi(cp); 831 int val = atoi (cp);
832
586 if (val < 0 || val >100) 833 if (val < 0 || val > 100)
587 LOG(llevError, "load_settings: permenent_experience_percentage" 834 LOG (llevError, "load_settings: permenent_experience_percentage" "must be between 0 and 100, %d is invalid\n", val);
588 "must be between 0 and 100, %d is invalid\n", val);
589 else 835 else
590 settings.permanent_exp_ratio = val; 836 settings.permanent_exp_ratio = val;
837 }
591 } else if (!strcasecmp(buf, "death_penalty_percentage")) { 838 else if (!strcasecmp (buf, "death_penalty_percentage"))
839 {
592 int val = atoi(cp); 840 int val = atoi (cp);
841
593 if (val < 0 || val >100) 842 if (val < 0 || val > 100)
594 LOG(llevError, "load_settings: death_penalty_percentage" 843 LOG (llevError, "load_settings: death_penalty_percentage" "must be between 0 and 100, %d is invalid\n", val);
595 "must be between 0 and 100, %d is invalid\n", val);
596 else 844 else
597 settings.death_penalty_ratio = val; 845 settings.death_penalty_ratio = val;
846 }
598 } else if (!strcasecmp(buf, "death_penalty_levels")) { 847 else if (!strcasecmp (buf, "death_penalty_levels"))
848 {
599 int val = atoi(cp); 849 int val = atoi (cp);
850
600 if (val < 0 || val > 255) 851 if (val < 0 || val > 255)
601 LOG(llevError, "load_settings: death_penalty_levels" 852 LOG (llevError, "load_settings: death_penalty_levels" "can not be negative, %d is invalid\n", val);
602 "can not be negative, %d is invalid\n", val);
603 else 853 else
604 settings.death_penalty_level = val; 854 settings.death_penalty_level = val;
855 }
605 }else if (!strcasecmp(buf, "balanced_stat_loss")) { 856 else if (!strcasecmp (buf, "balanced_stat_loss"))
857 {
606 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 858 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
859 {
607 settings.balanced_stat_loss=TRUE; 860 settings.balanced_stat_loss = TRUE;
861 }
608 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 862 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
863 {
609 settings.balanced_stat_loss=FALSE; 864 settings.balanced_stat_loss = FALSE;
865 }
610 } else { 866 else
611 LOG(llevError, "load_settings: Unknown value for "
612 "balanced_stat_loss: %s\n", cp);
613 } 867 {
868 LOG (llevError, "load_settings: Unknown value for " "balanced_stat_loss: %s\n", cp);
869 }
870 }
614 } else if (!strcasecmp(buf,"simple_exp")) { 871 else if (!strcasecmp (buf, "simple_exp"))
872 {
615 if (!strcasecmp(cp,"on") || !strcasecmp(cp,"true")) { 873 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
874 {
616 settings.simple_exp=TRUE; 875 settings.simple_exp = TRUE;
876 }
617 } else if (!strcasecmp(cp,"off") || !strcasecmp(cp,"false")) { 877 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
878 {
618 settings.simple_exp=FALSE; 879 settings.simple_exp = FALSE;
880 }
619 } else { 881 else
882 {
620 LOG(llevError,"load_settings: Unknown value for simple_exp: %s\n", 883 LOG (llevError, "load_settings: Unknown value for simple_exp: %s\n", cp);
621 cp); 884 }
622 } 885 }
623 } else if (!strcasecmp(buf, "item_power_factor")) { 886 else if (!strcasecmp (buf, "item_power_factor"))
887 {
624 float tmp = atof(cp); 888 float tmp = atof (cp);
889
625 if (tmp < 0) 890 if (tmp < 0)
626 LOG(llevError, "load_settings: item_power_factor must be a positive number (%f < 0)\n", 891 LOG (llevError, "load_settings: item_power_factor must be a positive number (%f < 0)\n", tmp);
627 tmp);
628 else 892 else
629 settings.item_power_factor = tmp; 893 settings.item_power_factor = tmp;
894 }
630 } else if (!strcasecmp(buf, "pk_luck_penalty")) { 895 else if (!strcasecmp (buf, "pk_luck_penalty"))
896 {
631 sint16 val = atoi(cp); 897 sint16 val = atoi (cp);
632 898
633 if (val < -100 || val >100) 899 if (val < -100 || val > 100)
634 LOG(llevError, "load_settings: pk_luck_penalty must be between -100 and 100" 900 LOG (llevError, "load_settings: pk_luck_penalty must be between -100 and 100" ", %d is invalid\n", val);
635 ", %d is invalid\n", val);
636 else 901 else
637 settings.pk_luck_penalty = val; 902 settings.pk_luck_penalty = val;
903 }
638 } else if (!strcasecmp(buf, "set_friendly_fire")) { 904 else if (!strcasecmp (buf, "set_friendly_fire"))
905 {
639 int val = atoi(cp); 906 int val = atoi (cp);
640 907
641#if COZY_SERVER 908#if COZY_SERVER
642 if (val < 0 || val >100) 909 if (val < 0 || val > 100)
643 LOG(llevError, "load_settings: set_friendly_fire must be between 0 an 100" 910 LOG (llevError, "load_settings: set_friendly_fire must be between 0 an 100" ", %d is invalid\n", val);
644 ", %d is invalid\n", val);
645#else 911#else
646 if (val < 1 || val >100) 912 if (val < 1 || val > 100)
647 LOG(llevError, "load_settings: set_friendly_fire must be between 1 an 100" 913 LOG (llevError, "load_settings: set_friendly_fire must be between 1 an 100" ", %d is invalid\n", val);
648 ", %d is invalid\n", val);
649#endif 914#endif
650 else 915 else
651 settings.set_friendly_fire = val; 916 settings.set_friendly_fire = val;
917 }
652 } else if ( !strcasecmp( buf, "armor_max_enchant" ) ) { 918 else if (!strcasecmp (buf, "armor_max_enchant"))
919 {
653 int max_e = atoi( cp ); 920 int max_e = atoi (cp);
921
654 if ( max_e <= 0 ) 922 if (max_e <= 0)
655 LOG( llevError, "load_settings: armor_max_enchant is %d\n", max_e ); 923 LOG (llevError, "load_settings: armor_max_enchant is %d\n", max_e);
656 else 924 else
657 settings.armor_max_enchant = max_e; 925 settings.armor_max_enchant = max_e;
926 }
658 } else if ( !strcasecmp( buf, "armor_weight_reduction" ) ) { 927 else if (!strcasecmp (buf, "armor_weight_reduction"))
928 {
659 int wr = atoi( cp ); 929 int wr = atoi (cp);
930
660 if ( wr < 0 ) 931 if (wr < 0)
661 LOG( llevError, "load_settings: armor_weight_reduction is %d\n", wr ); 932 LOG (llevError, "load_settings: armor_weight_reduction is %d\n", wr);
662 else 933 else
663 settings.armor_weight_reduction = wr; 934 settings.armor_weight_reduction = wr;
935 }
664 } else if ( !strcasecmp( buf, "armor_weight_linear" ) ) { 936 else if (!strcasecmp (buf, "armor_weight_linear"))
937 {
665 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 938 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
939 {
666 settings.armor_weight_linear=TRUE; 940 settings.armor_weight_linear = TRUE;
941 }
667 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 942 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
943 {
668 settings.armor_weight_linear=FALSE; 944 settings.armor_weight_linear = FALSE;
945 }
669 } else { 946 else
947 {
670 LOG(llevError, "load_settings: unknown value for armor_weight_linear: %s\n", cp); 948 LOG (llevError, "load_settings: unknown value for armor_weight_linear: %s\n", cp);
671 } 949 }
672 950
951 }
673 } else if ( !strcasecmp( buf, "armor_speed_improvement" ) ) { 952 else if (!strcasecmp (buf, "armor_speed_improvement"))
953 {
674 int wr = atoi( cp ); 954 int wr = atoi (cp);
955
675 if ( wr < 0 ) 956 if (wr < 0)
676 LOG( llevError, "load_settings: armor_speed_improvement is %d\n", wr ); 957 LOG (llevError, "load_settings: armor_speed_improvement is %d\n", wr);
677 else 958 else
678 settings.armor_speed_improvement = wr; 959 settings.armor_speed_improvement = wr;
960 }
679 } else if ( !strcasecmp( buf, "armor_speed_linear" ) ) { 961 else if (!strcasecmp (buf, "armor_speed_linear"))
962 {
680 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 963 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
964 {
681 settings.armor_speed_linear = TRUE; 965 settings.armor_speed_linear = TRUE;
966 }
682 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 967 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
968 {
683 settings.armor_speed_linear = FALSE; 969 settings.armor_speed_linear = FALSE;
970 }
684 } else { 971 else
972 {
685 LOG(llevError, "load_settings: unknown value for armor_speed_linear: %s\n", cp); 973 LOG (llevError, "load_settings: unknown value for armor_speed_linear: %s\n", cp);
686 } 974 }
687 975
976 }
688 } else if ( !strcasecmp( buf, "no_player_stealing" ) ) { 977 else if (!strcasecmp (buf, "no_player_stealing"))
978 {
689 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 979 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
980 {
690 settings.no_player_stealing = TRUE; 981 settings.no_player_stealing = TRUE;
982 }
691 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 983 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
984 {
692 settings.no_player_stealing = FALSE; 985 settings.no_player_stealing = FALSE;
986 }
693 } else { 987 else
988 {
694 LOG(llevError, "load_settings: unknown value for no_player_stealing: %s\n", cp); 989 LOG (llevError, "load_settings: unknown value for no_player_stealing: %s\n", cp);
695 } 990 }
696 991
992 }
697 } else if ( !strcasecmp( buf, "create_home_portals" ) ) { 993 else if (!strcasecmp (buf, "create_home_portals"))
994 {
698 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 995 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
996 {
699 settings.create_home_portals = TRUE; 997 settings.create_home_portals = TRUE;
998 }
700 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 999 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
1000 {
701 settings.create_home_portals = FALSE; 1001 settings.create_home_portals = FALSE;
1002 }
702 } else { 1003 else
1004 {
703 LOG(llevError, "load_settings: Unknown value for create_home_portals: %s\n", cp); 1005 LOG (llevError, "load_settings: Unknown value for create_home_portals: %s\n", cp);
1006 }
1007
1008 }
1009 else
704 } 1010 {
705
706 } else {
707 LOG(llevError,"Unknown value in settings file: %s\n", buf); 1011 LOG (llevError, "Unknown value in settings file: %s\n", buf);
708 } 1012 }
709 } 1013 }
710 close_and_delete(fp, comp); 1014 close_and_delete (fp, comp);
711} 1015}
712 1016
713 1017
714/* 1018/*
715 * init() is called only once, when starting the program. 1019 * init() is called only once, when starting the program.
716 */ 1020 */
717 1021
1022void
718void init(int argc, char **argv) { 1023init (int argc, char **argv)
719 1024{
720 init_done=0; /* Must be done before init_signal() */ 1025 init_done = 0; /* Must be done before init_signal() */
721 logfile=stderr; 1026 logfile = stderr;
722 parse_args(argc, argv, 1); /* First arg pass - right now it does 1027 parse_args (argc, argv, 1); /* First arg pass - right now it does
723 * nothing, but in future specifying the 1028 * nothing, but in future specifying the
724 * LibDir in this pass would be reasonable*/ 1029 * LibDir in this pass would be reasonable*/
725 1030
1031 cfperl_init ();
726 init_library(); /* Must be called early */ 1032 init_library (); /* Must be called early */
727 load_settings(); /* Load the settings file */ 1033 load_settings (); /* Load the settings file */
728 init_weather(); 1034 init_weather ();
729 load_materials(); 1035 load_materials ();
730 parse_args(argc, argv, 2); 1036 parse_args (argc, argv, 2);
731 fprintf(logfile,"Welcome to CrossFire, v%s\n",VERSION); 1037 fprintf (logfile, "Welcome to CrossFire, v%s\n", VERSION);
732 fprintf(logfile,"Copyright (C) 1994 Mark Wedel.\n"); 1038 fprintf (logfile, "Copyright (C) 1994 Mark Wedel.\n");
733 fprintf(logfile,"Copyright (C) 1992 Frank Tore Johansen.\n"); 1039 fprintf (logfile, "Copyright (C) 1992 Frank Tore Johansen.\n");
734 1040
735 if (strcmp(settings.dm_mail, "") != 0) { 1041 if (strcmp (settings.dm_mail, "") != 0)
1042 {
736 fprintf(logfile,"Maintained locally by: %s\n", settings.dm_mail); 1043 fprintf (logfile, "Maintained locally by: %s\n", settings.dm_mail);
737 fprintf(logfile,"Questions and bugs should be mailed to above address.\n"); 1044 fprintf (logfile, "Questions and bugs should be mailed to above address.\n");
738 } 1045 }
1046
739 SRANDOM(time(NULL)); 1047 SRANDOM (time (NULL));
740 1048
741 init_startup(); /* Write (C), check shutdown/forbid files */ 1049 init_startup (); /* Write (C), check shutdown/forbid files */
1050 init_uuid ();
742 init_signals(); /* Sets up signal interceptions */ 1051 init_signals (); /* Sets up signal interceptions */
743 init_commands(); /* Sort command tables */ 1052 init_commands (); /* Sort command tables */
744 read_map_log(); /* Load up the old temp map files */ 1053 read_map_log (); /* Load up the old temp map files */
745 init_skills(); 1054 init_skills ();
746 1055
747 parse_args(argc, argv, 3); 1056 parse_args (argc, argv, 3);
748 1057
749#ifndef WIN32 /* ***win32: no BecomeDaemon in windows */
750 if (settings.daemonmode) 1058 if (settings.daemonmode)
751 logfile = BecomeDaemon(settings.logfilename[0]=='\0'?"logfile":settings.logfilename); 1059 logfile = BecomeDaemon (settings.logfilename[0] == '\0' ? "logfile" : settings.logfilename);
752#endif
753 1060
754 init_beforeplay(); 1061 init_beforeplay ();
755 init_ericserver(); 1062 init_ericserver ();
756 metaserver_init();
757 init_done=1; 1063 init_done = 1;
758} 1064}
759 1065
760void usage(void) { 1066void
761 (void) fprintf(logfile, 1067usage (void)
1068{
762 "Usage: crossfire [-h] [-<flags>]...\n"); 1069 (void) fprintf (logfile, "Usage: crossfire [-h] [-<flags>]...\n");
763} 1070}
764 1071
765void help(void) { 1072void
1073help (void)
1074{
1075
766/* The information in usage is redundant with what is given below, so why call it? */ 1076/* The information in usage is redundant with what is given below, so why call it? */
1077
767/* usage();*/ 1078/* usage();*/
768 printf("Flags:\n"); 1079 printf ("Flags:\n");
769 printf(" -csport <port> Specifies the port to use for the new client/server code.\n"); 1080 printf (" -csport <port> Specifies the port to use for the new client/server code.\n");
770 printf(" -d Turns on some debugging.\n"); 1081 printf (" -d Turns on some debugging.\n");
771 printf(" +d Turns off debugging (useful if server compiled with debugging\n"); 1082 printf (" +d Turns off debugging (useful if server compiled with debugging\n");
772 printf(" as default).\n"); 1083 printf (" as default).\n");
773 printf(" -detach The server will go in the background, closing all\n"); 1084 printf (" -detach The server will go in the background, closing all\n");
774 printf(" connections to the tty.\n"); 1085 printf (" connections to the tty.\n");
775 printf(" -h Display this information.\n"); 1086 printf (" -h Display this information.\n");
776 printf(" -log <file> Specifies which file to send output to.\n"); 1087 printf (" -log <file> Specifies which file to send output to.\n");
777 printf(" Only has meaning if -detach is specified.\n"); 1088 printf (" Only has meaning if -detach is specified.\n");
778 printf(" -mon Turns on monster debugging.\n"); 1089 printf (" -mon Turns on monster debugging.\n");
779 printf(" -o Prints out info on what was defined at compile time.\n"); 1090 printf (" -o Prints out info on what was defined at compile time.\n");
780 printf(" -s Display the high-score list.\n"); 1091 printf (" -s Display the high-score list.\n");
781 printf(" -score <name or class> Displays all high scores with matching name/class.\n"); 1092 printf (" -score <name or class> Displays all high scores with matching name/class.\n");
782 printf(" -v Print version and contributors.\n"); 1093 printf (" -v Print version and contributors.\n");
783 printf(" -data Sets the lib dir (archetypes, treasures, etc.)\n"); 1094 printf (" -data Sets the lib dir (archetypes, treasures, etc.)\n");
784 printf(" -local Read/write local data (hiscore, unique items, etc.)\n"); 1095 printf (" -local Read/write local data (hiscore, unique items, etc.)\n");
785 printf(" -maps Sets the directory for maps.\n"); 1096 printf (" -maps Sets the directory for maps.\n");
786 printf(" -arch Sets the archetype file to use.\n"); 1097 printf (" -arch Sets the archetype file to use.\n");
787 printf(" -regions Sets the regions file to use.\n"); 1098 printf (" -regions Sets the regions file to use.\n");
788 printf(" -playerdir Sets the directory for the player files.\n"); 1099 printf (" -playerdir Sets the directory for the player files.\n");
789 printf(" -templatedir Sets the directory for template generate maps.\n"); 1100 printf (" -templatedir Sets the directory for template generate maps.\n");
790 printf(" -treasures Sets the treasures file to use.\n"); 1101 printf (" -treasures Sets the treasures file to use.\n");
791 printf(" -uniquedir Sets the unique items/maps directory.\n"); 1102 printf (" -uniquedir Sets the unique items/maps directory.\n");
792 printf(" -tmpdir Sets the directory for temporary files (mostly maps.)\n"); 1103 printf (" -tmpdir Sets the directory for temporary files (mostly maps.)\n");
793 printf(" -m Lists out suggested experience for all monsters.\n"); 1104 printf (" -m Lists out suggested experience for all monsters.\n");
794 printf(" -m2 Dumps out abilities.\n"); 1105 printf (" -m2 Dumps out abilities.\n");
795 printf(" -m3 Dumps out artifact information.\n"); 1106 printf (" -m3 Dumps out artifact information.\n");
796 printf(" -m4 Dumps out spell information.\n"); 1107 printf (" -m4 Dumps out spell information.\n");
797 printf(" -m5 Dumps out skill information.\n"); 1108 printf (" -m5 Dumps out skill information.\n");
798 printf(" -m6 Dumps out race information.\n"); 1109 printf (" -m6 Dumps out race information.\n");
799 printf(" -m7 Dumps out alchemy information.\n"); 1110 printf (" -m7 Dumps out alchemy information.\n");
800 printf(" -m8 Dumps out gods information.\n"); 1111 printf (" -m8 Dumps out gods information.\n");
801 printf(" -m9 Dumps out more alchemy information (formula checking).\n"); 1112 printf (" -m9 Dumps out more alchemy information (formula checking).\n");
802 printf(" -mt <name> Dumps out list of treasures for a monster.\n"); 1113 printf (" -mt <name> Dumps out list of treasures for a monster.\n");
803 exit(0); 1114 exit (0);
804} 1115}
805 1116
1117void
806void init_beforeplay(void) { 1118init_beforeplay (void)
1119{
807 init_archetypes(); /* If not called before, reads all archetypes from file */ 1120 init_archetypes (); /* If not called before, reads all archetypes from file */
808 init_artifacts(); /* If not called before, reads all artifacts from file */ 1121 init_artifacts (); /* If not called before, reads all artifacts from file */
809 init_spells(); /* If not called before, links archtypes used by spells */ 1122 init_spells (); /* If not called before, links archtypes used by spells */
810 init_regions(); /* If not called before, reads all regions from file */ 1123 init_regions (); /* If not called before, reads all regions from file */
811 init_archetype_pointers(); /* Setup global pointers to archetypes */ 1124 init_archetype_pointers (); /* Setup global pointers to archetypes */
812 init_races(); /* overwrite race designations using entries in lib/races file */ 1125 init_races (); /* overwrite race designations using entries in lib/races file */
813 init_gods(); /* init linked list of gods from archs*/ 1126 init_gods (); /* init linked list of gods from archs */
814 init_readable(); /* inits useful arrays for readable texts */ 1127 init_readable (); /* inits useful arrays for readable texts */
815 init_formulae(); /* If not called before, reads formulae from file */ 1128 init_formulae (); /* If not called before, reads formulae from file */
816 1129
817 switch(settings.dumpvalues) { 1130 switch (settings.dumpvalues)
1131 {
818 case 1: 1132 case 1:
819 print_monsters(); 1133 print_monsters ();
820 exit(0); 1134 exit (0);
821 case 2: 1135 case 2:
822 dump_abilities(); 1136 dump_abilities ();
823 exit(0); 1137 exit (0);
824 case 3: 1138 case 3:
825 dump_artifacts(); 1139 dump_artifacts ();
826 exit(0); 1140 exit (0);
827 case 4: 1141 case 4:
828 dump_spells(); 1142 dump_spells ();
829 exit(0); 1143 exit (0);
830 case 5: 1144 case 5:
831 exit(0); 1145 exit (0);
832 case 6: 1146 case 6:
833 dump_races(); 1147 dump_races ();
834 exit(0); 1148 exit (0);
835 case 7: 1149 case 7:
836 dump_alchemy(); 1150 dump_alchemy ();
837 exit(0); 1151 exit (0);
838 case 8:
839 dump_gods();
840 exit(0);
841 case 9: 1152 case 9:
842 dump_alchemy_costs(); 1153 dump_alchemy_costs ();
843 exit(0); 1154 exit (0);
844 case 10: 1155 case 10:
845 dump_monster_treasure(settings.dumparg); 1156 dump_monster_treasure (settings.dumparg);
846 exit(0); 1157 exit (0);
847 } 1158 }
848} 1159}
849 1160
1161void
850void init_startup(void) { 1162init_startup (void)
1163{
851 char buf[MAX_BUF]; 1164 char buf[MAX_BUF];
852 FILE *fp; 1165 FILE *fp;
853 int comp; 1166 int comp;
854 1167
855#ifdef SHUTDOWN_FILE 1168#ifdef SHUTDOWN_FILE
856 sprintf(buf,"%s/%s",settings.confdir,SHUTDOWN_FILE); 1169 sprintf (buf, "%s/%s", settings.confdir, SHUTDOWN_FILE);
857 if ((fp = open_and_uncompress(buf, 0, &comp)) != NULL) { 1170 if ((fp = open_and_uncompress (buf, 0, &comp)) != NULL)
1171 {
858 while (fgets(buf, MAX_BUF-1, fp) != NULL) 1172 while (fgets (buf, MAX_BUF - 1, fp) != NULL)
859 printf("%s", buf); 1173 printf ("%s", buf);
860 close_and_delete(fp, comp); 1174 close_and_delete (fp, comp);
861 exit(1); 1175 exit (1);
862 } 1176 }
863#endif 1177#endif
864 1178
865 if (forbid_play()) { /* Maybe showing highscore should be allowed? */ 1179 if (forbid_play ())
1180 { /* Maybe showing highscore should be allowed? */
866 LOG(llevError, "CrossFire: Playing not allowed.\n"); 1181 LOG (llevError, "CrossFire: Playing not allowed.\n");
867 exit(-1); 1182 exit (-1);
868 } 1183 }
869} 1184}
870 1185
871/* 1186/*
872 * compile_info(): activated with the -o flag. 1187 * compile_info(): activated with the -o flag.
873 * It writes out information on how Imakefile and config.h was configured 1188 * It writes out information on how Imakefile and config.h was configured
874 * at compile time. 1189 * at compile time.
875 */ 1190 */
876 1191
1192void
877void compile_info(void) { 1193compile_info (void)
1194{
878 int i=0; 1195 int i = 0;
1196
879 printf("Non-standard include files:\n"); 1197 printf ("Non-standard include files:\n");
880#if !defined (__STRICT_ANSI__) || defined (__sun__) 1198#if !defined (__STRICT_ANSI__) || defined (__sun__)
881#if !defined (Mips) 1199# if !defined (Mips)
882 printf("<stdlib.h>\n"); 1200 printf ("<stdlib.h>\n");
883 i=1; 1201 i = 1;
884#endif 1202# endif
885#if !defined (MACH) && !defined (sony) 1203# if !defined (MACH) && !defined (sony)
886 printf("<malloc.h>\n"); 1204 printf ("<malloc.h>\n");
887 i=1; 1205 i = 1;
888#endif 1206# endif
889#endif 1207#endif
890#ifndef __STRICT_ANSI__ 1208#ifndef __STRICT_ANSI__
891#ifndef MACH 1209# ifndef MACH
892 printf("<memory.h\n"); 1210 printf ("<memory.h\n");
893 i=1; 1211 i = 1;
894#endif 1212# endif
895#endif 1213#endif
896#ifndef sgi 1214#ifndef sgi
897 printf("<sys/timeb.h>\n"); 1215 printf ("<sys/timeb.h>\n");
898 i=1; 1216 i = 1;
899#endif 1217#endif
900 if(!i) 1218 if (!i)
901 printf("(none)\n"); 1219 printf ("(none)\n");
902 printf("Datadir:\t\t%s\n",settings.datadir); 1220 printf ("Datadir:\t\t%s\n", settings.datadir);
903 printf("Localdir:\t\t%s\n",settings.localdir); 1221 printf ("Localdir:\t\t%s\n", settings.localdir);
904#ifdef PERM_FILE 1222#ifdef PERM_FILE
905 printf("Perm file:\t<ETC>/%s\n",PERM_FILE); 1223 printf ("Perm file:\t<ETC>/%s\n", PERM_FILE);
906#endif 1224#endif
907#ifdef SHUTDOWN_FILE 1225#ifdef SHUTDOWN_FILE
908 printf("Shutdown file:\t<ETC>/%s\n",SHUTDOWN_FILE); 1226 printf ("Shutdown file:\t<ETC>/%s\n", SHUTDOWN_FILE);
909#endif 1227#endif
910 printf("Save player:\t<true>\n"); 1228 printf ("Save player:\t<true>\n");
911 printf("Save mode:\t%4.4o\n",SAVE_MODE); 1229 printf ("Save mode:\t%4.4o\n", SAVE_MODE);
912 printf("Playerdir:\t<VAR>/%s\n",settings.playerdir); 1230 printf ("Playerdir:\t<VAR>/%s\n", settings.playerdir);
913 printf("Itemsdir:\t<VAR>/%s\n", settings.uniquedir); 1231 printf ("Itemsdir:\t<VAR>/%s\n", settings.uniquedir);
914 printf("Tmpdir:\t\t%s\n",settings.tmpdir); 1232 printf ("Tmpdir:\t\t%s\n", settings.tmpdir);
915 printf("Map max timeout:\t%d\n",MAP_MAXTIMEOUT); 1233 printf ("Map max timeout:\t%d\n", MAP_MAXTIMEOUT);
916 printf("Max objects:\t%d\n",MAX_OBJECTS); 1234 printf ("Max objects:\t%d\n", MAX_OBJECTS);
917#ifdef USE_CALLOC 1235#ifdef USE_CALLOC
918 printf("Use_calloc:\t<true>\n"); 1236 printf ("Use_calloc:\t<true>\n");
919#else 1237#else
920 printf("Use_calloc:\t<false>\n"); 1238 printf ("Use_calloc:\t<false>\n");
921#endif 1239#endif
922 1240
923#ifdef X_EDITOR 1241#ifdef X_EDITOR
924 printf("Editor:\t\t%s\n",X_EDITOR); 1242 printf ("Editor:\t\t%s\n", X_EDITOR);
925#endif 1243#endif
926 1244
927 printf("Max_time:\t%d\n",MAX_TIME); 1245 printf ("Max_time:\t%d\n", MAX_TIME);
928 1246
929#ifdef WIN32 /* ***win32 compile_info(): remove execl... */
930 printf("Logfilename:\t%s\n",settings.logfilename);
931 exit(0);
932#else
933 execl("/bin/uname", "uname", "-a", NULL); 1247 execl ("/bin/uname", "uname", "-a", NULL);
934 LOG(llevError, "Oops, shouldn't have gotten here: execl(/bin/uname) failed: %s\n", strerror(errno)); 1248 LOG (llevError, "Oops, shouldn't have gotten here: execl(/bin/uname) failed: %s\n", strerror (errno));
935 exit(-1); 1249 exit (-1);
1250}
1251
1252/* Signal handlers: */
1253
1254void
1255rec_sigsegv (int i)
1256{
1257 LOG (llevError, "\nSIGSEGV received.\n");
1258 fatal_signal (1, 1);
1259}
1260
1261void
1262rec_sigint (int i)
1263{
1264 LOG (llevInfo, "\nSIGINT received.\n");
1265 fatal_signal (0, 1);
1266}
1267
1268void
1269rec_sighup (int i)
1270{
1271 LOG (llevInfo, "\nSIGHUP received\n");
1272 if (init_done)
1273 {
1274 emergency_save (0);
1275 cleanup ();
1276 }
1277 exit (0);
1278}
1279
1280void
1281rec_sigquit (int i)
1282{
1283 LOG (llevInfo, "\nSIGQUIT received\n");
1284 fatal_signal (1, 1);
1285}
1286
1287void
1288rec_sigbus (int i)
1289{
1290#ifdef SIGBUS
1291 LOG (llevError, "\nSIGBUS received\n");
1292 fatal_signal (1, 1);
936#endif 1293#endif
937} 1294}
938 1295
939/* Signal handlers: */ 1296void
940 1297rec_sigterm (int i)
941void rec_sigsegv(int i) { 1298{
942 LOG(llevError,"\nSIGSEGV received.\n");
943 fatal_signal(1, 1);
944}
945
946void rec_sigint(int i) {
947 LOG(llevInfo,"\nSIGINT received.\n"); 1299 LOG (llevInfo, "\nSIGTERM received\n");
948 fatal_signal(0, 1); 1300 fatal_signal (0, 1);
949} 1301}
950 1302
951void rec_sighup(int i) { 1303void
952 LOG(llevInfo,"\nSIGHUP received\n"); 1304fatal_signal (int make_core, int close_sockets)
1305{
953 if(init_done) { 1306 if (init_done)
954 emergency_save(0); 1307 {
955 cleanup(); 1308 cleanup ();
1309 //emergency_save (0);
1310 //clean_tmp_files ();
956 } 1311 }
1312
1313 if (make_core)
1314 abort ();
1315
957 exit(0); 1316 exit (0);
958} 1317}
959 1318
960void rec_sigquit(int i) { 1319void
961 LOG(llevInfo,"\nSIGQUIT received\n"); 1320init_signals (void)
962 fatal_signal(1, 1); 1321{
963} 1322 signal (SIGHUP, rec_sighup);
964 1323 signal (SIGINT, rec_sigint);
965void rec_sigbus(int i) { 1324 signal (SIGQUIT, rec_sigquit);
1325 signal (SIGSEGV, rec_sigsegv);
1326 signal (SIGPIPE, SIG_IGN);
966#ifdef SIGBUS 1327#ifdef SIGBUS
967 LOG(llevError,"\nSIGBUS received\n"); 1328 signal (SIGBUS, rec_sigbus);
968 fatal_signal(1, 1);
969#endif 1329#endif
970}
971
972void rec_sigterm(int i) {
973 LOG(llevInfo,"\nSIGTERM received\n");
974 fatal_signal(0, 1);
975}
976
977void fatal_signal(int make_core, int close_sockets) {
978 if(init_done) {
979 emergency_save(0);
980 clean_tmp_files();
981 }
982 if(make_core)
983 abort();
984 exit(0);
985}
986
987void init_signals(void) {
988#ifndef WIN32 /* init_signals() remove signals */
989 signal(SIGHUP,rec_sighup);
990 signal(SIGINT,rec_sigint);
991 signal(SIGQUIT,rec_sigquit);
992 signal(SIGSEGV,rec_sigsegv);
993 signal(SIGPIPE,SIG_IGN);
994#ifdef SIGBUS
995 signal(SIGBUS,rec_sigbus);
996#endif
997 signal(SIGTERM,rec_sigterm); 1330 signal (SIGTERM, rec_sigterm);
998#endif
999} 1331}
1000 1332
1001/* init_races() - reads the races file in the lib/ directory, then 1333/* init_races() - reads the races file in the lib/ directory, then
1002 * overwrites old 'race' entries. This routine allow us to quickly 1334 * overwrites old 'race' entries. This routine allow us to quickly
1003 * re-configure the 'alignment' of monsters, objects. Useful for 1335 * re-configure the 'alignment' of monsters, objects. Useful for
1004 * putting together lists of creatures, etc that belong to gods. 1336 * putting together lists of creatures, etc that belong to gods.
1005 */ 1337 */
1006 1338
1339void
1007void init_races (void) { 1340init_races (void)
1341{
1008 FILE *file; 1342 FILE *file;
1009 char race[MAX_BUF], fname[MAX_BUF], buf[MAX_BUF], *cp, variable[MAX_BUF]; 1343 char race[MAX_BUF], fname[MAX_BUF], buf[MAX_BUF], *cp, variable[MAX_BUF];
1010 archetype *mon=NULL; 1344 archetype *mon = NULL;
1011 static int init_done=0; 1345 static int init_done = 0;
1012 1346
1013 if (init_done) return; 1347 if (init_done)
1014 init_done=1;
1015 first_race=NULL;
1016
1017 sprintf(fname,"%s/races",settings.datadir);
1018 LOG(llevDebug, "Reading races from %s...",fname);
1019 if(! (file=fopen(fname,"r"))) {
1020 LOG(llevError, "Cannot open races file %s: %s\n", fname, strerror(errno));
1021 return; 1348 return;
1349 init_done = 1;
1350 first_race = 0;
1351
1352 sprintf (fname, "%s/races", settings.datadir);
1353 LOG (llevDebug, "Reading races from %s...", fname);
1354 if (!(file = fopen (fname, "r")))
1355 {
1356 LOG (llevError, "Cannot open races file %s: %s\n", fname, strerror (errno));
1357 return;
1022 } 1358 }
1023 1359
1024 while(fgets(buf,MAX_BUF,file)!=NULL) { 1360 while (fgets (buf, MAX_BUF, file) != NULL)
1361 {
1025 int set_race=1,set_list=1; 1362 int set_race = 1, set_list = 1;
1026 if(*buf=='#') continue; 1363
1364 if (*buf == '#')
1365 continue;
1366
1027 if((cp=strchr(buf,'\n'))!=NULL) 1367 if ((cp = strchr (buf, '\n')) != NULL)
1028 *cp='\0'; 1368 *cp = '\0';
1369
1029 cp=buf; 1370 cp = buf;
1030 while(*cp==' '||*cp=='!'||*cp=='@') { 1371 while (*cp == ' ' || *cp == '!' || *cp == '@')
1031 if(*cp=='!') set_race=0; 1372 {
1032 if(*cp=='@') set_list=0; 1373 if (*cp == '!')
1374 set_race = 0;
1375 if (*cp == '@')
1376 set_list = 0;
1033 cp++; 1377 cp++;
1034 } 1378 }
1035 if(sscanf(cp,"RACE %s",variable)) { /* set new race value */ 1379
1380 if (sscanf (cp, "RACE %s", variable))
1381 { /* set new race value */
1036 strcpy(race,variable); 1382 strcpy (race, variable);
1383 }
1037 } else { 1384 else
1385 {
1038 char *cp1; 1386 char *cp1;
1387
1039 /* Take out beginning spaces */ 1388 /* Take out beginning spaces */
1040 for (cp1 = cp; *cp1==' '; cp1++); 1389 for (cp1 = cp; *cp1 == ' '; cp1++)
1390 ;
1041 /* Remove newline and trailing spaces */ 1391 /* Remove newline and trailing spaces */
1042 for (cp1 = cp + strlen(cp) -1; *cp1 == '\n' || *cp1 == ' '; cp1 --) { 1392 for (cp1 = cp + strlen (cp) - 1; *cp1 == '\n' || *cp1 == ' '; cp1--)
1393 {
1043 *cp1='\0'; 1394 *cp1 = '\0';
1044 if (cp==cp1) break; 1395 if (cp == cp1)
1396 break;
1045 } 1397 }
1046 1398
1047 if (cp[strlen(cp)-1]=='\n') cp[strlen(cp)-1]='\0'; 1399 if (cp[strlen (cp) - 1] == '\n')
1400 cp[strlen (cp) - 1] = '\0';
1401
1048 /* set creature race to race value */ 1402 /* set creature race to race value */
1049 if((mon=find_archetype(cp))==NULL) 1403 if ((mon = archetype::find (cp)) == NULL)
1050 LOG(llevError,"\nCreature %s in race file lacks archetype",cp); 1404 LOG (llevError, "\nCreature %s in race file lacks archetype", cp);
1051 else { 1405 else
1406 {
1052 if(set_race&&(!mon->clone.race||strcmp(mon->clone.race,race))) { 1407 if (set_race && (!mon->clone.race || strcmp (mon->clone.race, race)))
1408 {
1053 if(mon->clone.race) { 1409 if (mon->clone.race)
1054 LOG(llevDebug,"\n Resetting race to %s from %s for archetype %s", 1410 LOG (llevDebug, "\n Resetting race to %s from %s for archetype %s", race, &mon->clone.race, &mon->name);
1055 race,mon->clone.race,mon->name); 1411
1056 free_string(mon->clone.race); 1412 mon->clone.race = race;
1057 } 1413 }
1058 mon->clone.race=add_string(race); 1414
1059 }
1060 /* if the arch is a monster, add it to the race list */ 1415 /* if the arch is a monster, add it to the race list */
1061 if(set_list&&QUERY_FLAG(&mon->clone,FLAG_MONSTER)) 1416 if (set_list && QUERY_FLAG (&mon->clone, FLAG_MONSTER))
1062 add_to_racelist(race, &mon->clone); 1417 add_to_racelist (race, &mon->clone);
1063 } 1418 }
1064 } 1419 }
1065 } 1420 }
1421
1066 fclose(file); 1422 fclose (file);
1067 LOG(llevDebug,"done.\n"); 1423 LOG (llevDebug, "done.\n");
1068} 1424}
1069 1425
1426void
1070void dump_races(void) 1427dump_races (void)
1071{ 1428{
1072 racelink *list; 1429 racelink *list;
1073 objectlink *tmp; 1430 objectlink *tmp;
1431
1074 for(list=first_race;list;list=list->next) { 1432 for (list = first_race; list; list = list->next)
1433 {
1075 fprintf(stderr,"\nRACE %s:\t",list->name); 1434 fprintf (stderr, "\nRACE %s:\t", &list->name);
1076 for(tmp=list->member;tmp;tmp=tmp->next) 1435 for (tmp = list->member; tmp; tmp = tmp->next)
1077 fprintf(stderr,"%s(%d), ",tmp->ob->arch->name,tmp->ob->level); 1436 fprintf (stderr, "%s(%d), ", &tmp->ob->arch->name, tmp->ob->level);
1078 } 1437 }
1438
1079 fprintf(stderr,"\n"); 1439 fprintf (stderr, "\n");
1080} 1440}
1081 1441
1442void
1082void add_to_racelist (const char *race_name, object *op) { 1443add_to_racelist (const char *race_name, object *op)
1444{
1083 racelink *race; 1445 racelink *race;
1084 1446
1085 if(!op||!race_name) return; 1447 if (!op || !race_name)
1448 return;
1449
1086 race=find_racelink(race_name); 1450 race = find_racelink (race_name);
1087 1451
1088 if(!race) { /* add in a new race list */ 1452 if (!race)
1453 { /* add in a new race list */
1089 race = get_racelist(); 1454 race = get_racelist ();
1090 race->next = first_race; 1455 race->next = first_race;
1091 first_race = race; 1456 first_race = race;
1092 race->name=add_string(race_name); 1457 race->name = race_name;
1093 } 1458 }
1094 1459
1095 if(race->member->ob) { 1460 if (race->member->ob)
1461 {
1096 objectlink *tmp = get_objectlink(); 1462 objectlink *tmp = get_objectlink ();
1463
1097 tmp->next=race->member; 1464 tmp->next = race->member;
1098 race->member = tmp; 1465 race->member = tmp;
1099 } 1466 }
1467
1100 race->nrof++; 1468 race->nrof++;
1101 race->member->ob = op; 1469 race->member->ob = op;
1102} 1470}
1103 1471
1104racelink * get_racelist ( ) { 1472racelink *
1105 racelink *list; 1473get_racelist ()
1106 1474{
1107 list = (racelink *) malloc(sizeof(racelink )); 1475 racelink *list = new racelink;
1476
1108 list->name=NULL; 1477 list->name = 0;
1109 list->nrof=0; 1478 list->nrof = 0;
1479 list->next = 0;
1110 list->member=get_objectlink(); 1480 list->member = get_objectlink ();
1111 list->next=NULL;
1112 1481
1113 return list; 1482 return list;
1114} 1483}
1115 1484
1485racelink *
1116racelink * find_racelink( const char *name ) { 1486find_racelink (const char *name)
1117 racelink *test=NULL; 1487{
1118 1488 if (name)
1119 if(name&&first_race) 1489 for (racelink *link = first_race; link; link = link->next)
1120 for(test=first_race;test&&test!=test->next;test=test->next) 1490 if (!link->name || !strcmp (name, link->name))
1121 if(!test->name||!strcmp(name,test->name)) break; 1491 return link;
1122 1492
1123 return test; 1493 return 0;
1124} 1494}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines