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.3 by root, Tue Aug 29 05:03:55 2006 UTC vs.
Revision 1.4 by root, Tue Aug 29 08:01:37 2006 UTC

1/* 1/*
2 * static char *rcsid_init_c = 2 * static char *rcsid_init_c =
3 * "$Id: init.C,v 1.3 2006/08/29 05:03:55 root Exp $"; 3 * "$Id: init.C,v 1.4 2006/08/29 08:01:37 root Exp $";
4 */ 4 */
5 5
6/* 6/*
7 CrossFire, A Multiplayer game for X-windows 7 CrossFire, A Multiplayer game for X-windows
8 8
73void set_csport(char *val) 73void set_csport(char *val)
74{ 74{
75 settings.csport=atoi(val); 75 settings.csport=atoi(val);
76#ifndef WIN32 /* ***win32: set_csport: we remove csport error secure check here, do this later */ 76#ifndef WIN32 /* ***win32: set_csport: we remove csport error secure check here, do this later */
77 if (settings.csport<=0 || settings.csport>32765 || 77 if (settings.csport<=0 || settings.csport>32765 ||
78 (settings.csport<1024 && getuid()!=0)) { 78 (settings.csport<1024 && getuid()!=0)) {
79 LOG(llevError, "%d is an invalid csport number.\n", settings.csport); 79 LOG(llevError, "%d is an invalid csport number.\n", settings.csport);
80 exit(1); 80 exit(1);
81 } 81 }
82#endif /* win32 */ 82#endif /* win32 */
83} 83}
84 84
85/* Most of this is shamelessly stolen from XSysStats. But since that is 85/* Most of this is shamelessly stolen from XSysStats. But since that is
88struct Command_Line_Options { 88struct Command_Line_Options {
89 const char *cmd_option; /* how it is called on the command line */ 89 const char *cmd_option; /* how it is called on the command line */
90 uint8 num_args; /* Number or args it takes */ 90 uint8 num_args; /* Number or args it takes */
91 uint8 pass; /* What pass this should be processed on. */ 91 uint8 pass; /* What pass this should be processed on. */
92 void (*func)(); /* function to call when we match this. 92 void (*func)(); /* function to call when we match this.
93 * if num_args is true, than that gets passed 93 * if num_args is true, than that gets passed
94 * to the function, otherwise nothing is passed 94 * to the function, otherwise nothing is passed
95 */ 95 */
96}; 96};
97 97
98/* The way this system works is pretty simple - parse_args takes 98/* 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 99 * 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), 100 * matches both in name and in pass (and we have enough options),
166{ 166{
167 size_t i; 167 size_t i;
168 int on_arg=1; 168 int on_arg=1;
169 169
170 while (on_arg<argc) { 170 while (on_arg<argc) {
171 for (i=0; i<sizeof(options)/sizeof(struct Command_Line_Options); i++) { 171 for (i=0; i<sizeof(options)/sizeof(struct Command_Line_Options); i++) {
172 if (!strcmp(options[i].cmd_option, argv[on_arg])) { 172 if (!strcmp(options[i].cmd_option, argv[on_arg])) {
173 /* Found a matching option, but should not be processed on 173 /* Found a matching option, but should not be processed on
174 * this pass. Just skip over it 174 * this pass. Just skip over it
175 */ 175 */
176 if (options[i].pass != pass) { 176 if (options[i].pass != pass) {
177 on_arg += options[i].num_args+1; 177 on_arg += options[i].num_args+1;
178 break; 178 break;
179 } 179 }
180 if (options[i].num_args) { 180 if (options[i].num_args) {
181 if ((on_arg+options[i].num_args)>=argc) { 181 if ((on_arg+options[i].num_args)>=argc) {
182 fprintf(stderr,"%s requires an argument.\n", options[i].cmd_option); 182 fprintf(stderr,"%s requires an argument.\n", options[i].cmd_option);
183 exit(1); 183 exit(1);
184 } 184 }
185 else { 185 else {
186 if (options[i].num_args==1) 186 if (options[i].num_args==1)
187 ((void (*)(char*))options[i].func)(argv[on_arg+1]); 187 ((void (*)(char*))options[i].func)(argv[on_arg+1]);
188 if (options[i].num_args==2) 188 if (options[i].num_args==2)
189 ((void (*)(char*,char*))options[i].func)(argv[on_arg+1],argv[on_arg+2]); 189 ((void (*)(char*,char*))options[i].func)(argv[on_arg+1],argv[on_arg+2]);
190 on_arg +=options[i].num_args+1; 190 on_arg +=options[i].num_args+1;
191 } 191 }
192 } 192 }
193 else { /* takes no args */ 193 else { /* takes no args */
194 options[i].func(); 194 options[i].func();
195 on_arg++; 195 on_arg++;
196 } 196 }
197 break; 197 break;
198 } 198 }
199 } 199 }
200 if (i==sizeof(options)/sizeof(struct Command_Line_Options)) { 200 if (i==sizeof(options)/sizeof(struct Command_Line_Options)) {
201 fprintf(stderr,"Unknown option: %s\n", argv[on_arg]); 201 fprintf(stderr,"Unknown option: %s\n", argv[on_arg]);
202 usage(); 202 usage();
203 exit(1); 203 exit(1);
204 } 204 }
205 } 205 }
206} 206}
207 207
208static materialtype_t *get_empty_mat(void) { 208static materialtype_t *get_empty_mat(void) {
209 materialtype_t *mt; 209 materialtype_t *mt;
210 int i; 210 int i;
211 211
212 mt = (materialtype_t *)malloc(sizeof(materialtype_t)); 212 mt = (materialtype_t *)malloc(sizeof(materialtype_t));
213 if (mt == NULL) 213 if (mt == NULL)
214 fatal(OUT_OF_MEMORY); 214 fatal(OUT_OF_MEMORY);
215 mt->name = NULL; 215 mt->name = NULL;
216 mt->description = NULL; 216 mt->description = NULL;
217 for (i=0; i < NROFATTACKS; i++) { 217 for (i=0; i < NROFATTACKS; i++) {
218 mt->save[i] = 0; 218 mt->save[i] = 0;
219 mt->mod[i] = 0; 219 mt->mod[i] = 0;
220 } 220 }
221 mt->chance = 0; 221 mt->chance = 0;
222 mt->difficulty = 0; 222 mt->difficulty = 0;
223 mt->magic = 0; 223 mt->magic = 0;
224 mt->damage = 0; 224 mt->damage = 0;
248 return; 248 return;
249 } 249 }
250 mt = get_empty_mat(); 250 mt = get_empty_mat();
251 materialt = mt; 251 materialt = mt;
252 while (fgets(buf, MAX_BUF, fp) != NULL) { 252 while (fgets(buf, MAX_BUF, fp) != NULL) {
253 if (*buf=='#') 253 if (*buf=='#')
254 continue; 254 continue;
255 if ((cp=strchr(buf, '\n'))!=NULL) 255 if ((cp=strchr(buf, '\n'))!=NULL)
256 *cp='\0'; 256 *cp='\0';
257 cp=buf; 257 cp=buf;
258 while(*cp==' ') /* Skip blanks */ 258 while(*cp==' ') /* Skip blanks */
259 cp++; 259 cp++;
260 if (!strncmp(cp, "name", 4)) { 260 if (!strncmp(cp, "name", 4)) {
261 /* clean up the previous entry */ 261 /* clean up the previous entry */
262 if (mt->next != NULL) { 262 if (mt->next != NULL) {
263 if (mt->description == NULL) 263 if (mt->description == NULL)
264 mt->description = add_string(mt->name); 264 mt->description = add_string(mt->name);
265 mt = mt->next; 265 mt = mt->next;
266 } 266 }
267 mt->next = get_empty_mat(); 267 mt->next = get_empty_mat();
268 mt->name = add_string(strchr(cp, ' ') + 1); 268 mt->name = add_string(strchr(cp, ' ') + 1);
269 } else if (!strncmp(cp, "description", 11)) { 269 } else if (!strncmp(cp, "description", 11)) {
270 mt->description = add_string(strchr(cp, ' ') + 1); 270 mt->description = add_string(strchr(cp, ' ') + 1);
271 } else if (sscanf(cp, "material %d", &value)) { 271 } else if (sscanf(cp, "material %d", &value)) {
272 mt->material = value; 272 mt->material = value;
273 } else if (!strncmp(cp, "saves", 5)) { 273 } else if (!strncmp(cp, "saves", 5)) {
274 cp = strchr(cp, ' ') + 1; 274 cp = strchr(cp, ' ') + 1;
275 for (i=0; i < NROFATTACKS; i++) { 275 for (i=0; i < NROFATTACKS; i++) {
276 if (cp == NULL) { 276 if (cp == NULL) {
277 mt->save[i] = 0; 277 mt->save[i] = 0;
278 continue; 278 continue;
279 } 279 }
280 if ((next=strchr(cp,',')) != NULL) 280 if ((next=strchr(cp,',')) != NULL)
281 *(next++) = '\0'; 281 *(next++) = '\0';
282 sscanf(cp, "%d", &value); 282 sscanf(cp, "%d", &value);
283 mt->save[i] = (sint8)value; 283 mt->save[i] = (sint8)value;
284 cp = next; 284 cp = next;
285 } 285 }
286 } else if (!strncmp(cp, "mods", 4)) { 286 } else if (!strncmp(cp, "mods", 4)) {
287 cp = strchr(cp, ' ') + 1; 287 cp = strchr(cp, ' ') + 1;
288 for (i=0; i < NROFATTACKS; i++) { 288 for (i=0; i < NROFATTACKS; i++) {
289 if (cp == NULL) { 289 if (cp == NULL) {
290 mt->save[i] = 0; 290 mt->save[i] = 0;
291 continue; 291 continue;
292 } 292 }
293 if ((next=strchr(cp,',')) != NULL) 293 if ((next=strchr(cp,',')) != NULL)
294 *(next++) = '\0'; 294 *(next++) = '\0';
295 sscanf(cp, "%d", &value); 295 sscanf(cp, "%d", &value);
296 mt->mod[i] = (sint8)value; 296 mt->mod[i] = (sint8)value;
297 cp = next; 297 cp = next;
298 } 298 }
299 } else if (sscanf(cp, "chance %d\n", &value)) { 299 } else if (sscanf(cp, "chance %d\n", &value)) {
300 mt->chance = (sint8)value; 300 mt->chance = (sint8)value;
301 } else if (sscanf(cp, "diff %d\n", &value)) { 301 } else if (sscanf(cp, "diff %d\n", &value)) {
302 mt->difficulty = (sint8)value; 302 mt->difficulty = (sint8)value;
303 } else if (sscanf(cp, "magic %d\n", &value)) { 303 } else if (sscanf(cp, "magic %d\n", &value)) {
304 mt->magic = (sint8)value; 304 mt->magic = (sint8)value;
305 } else if (sscanf(cp, "damage %d\n", &value)) { 305 } else if (sscanf(cp, "damage %d\n", &value)) {
306 mt->damage= (sint8)value; 306 mt->damage= (sint8)value;
307 } else if (sscanf(cp, "wc %d\n", &value)) { 307 } else if (sscanf(cp, "wc %d\n", &value)) {
308 mt->wc = (sint8)value; 308 mt->wc = (sint8)value;
309 } else if (sscanf(cp, "ac %d\n", &value)) { 309 } else if (sscanf(cp, "ac %d\n", &value)) {
310 mt->ac = (sint8)value; 310 mt->ac = (sint8)value;
311 } else if (sscanf(cp, "sp %d\n", &value)) { 311 } else if (sscanf(cp, "sp %d\n", &value)) {
312 mt->sp = (sint8)value; 312 mt->sp = (sint8)value;
313 } else if (sscanf(cp, "weight %d\n", &value)) { 313 } else if (sscanf(cp, "weight %d\n", &value)) {
314 mt->weight = value; 314 mt->weight = value;
315 } else if (sscanf(cp, "value %d\n", &value)) { 315 } else if (sscanf(cp, "value %d\n", &value)) {
316 mt->value = value; 316 mt->value = value;
317 } 317 }
318 } 318 }
319 if (mt->next) 319 if (mt->next)
320 { 320 {
321 free(mt->next); 321 free(mt->next);
322 mt->next = NULL; 322 mt->next = NULL;
340 /* We don't require a settings file at current time, but down the road, 340 /* 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 341 * there will probably be so many values that not having a settings file
342 * will not be a good thing. 342 * will not be a good thing.
343 */ 343 */
344 if ((fp = open_and_uncompress(buf, 0, &comp)) == NULL) { 344 if ((fp = open_and_uncompress(buf, 0, &comp)) == NULL) {
345 LOG(llevError,"Warning: No settings file found\n"); 345 LOG(llevError,"Warning: No settings file found\n");
346 return; 346 return;
347 } 347 }
348 while (fgets(buf, MAX_BUF-1, fp) != NULL) { 348 while (fgets(buf, MAX_BUF-1, fp) != NULL) {
349 if (buf[0] == '#') continue; 349 if (buf[0] == '#') continue;
350 /* eliminate newline */ 350 /* eliminate newline */
351 if ((cp=strrchr(buf,'\n'))!=NULL) *cp='\0'; 351 if ((cp=strrchr(buf,'\n'))!=NULL) *cp='\0';
352 352
353 /* Skip over empty lines */ 353 /* Skip over empty lines */
354 if (buf[0] == 0) continue; 354 if (buf[0] == 0) continue;
355 355
356 /* Skip all the spaces and set them to nulls. If not space, 356 /* 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. 357 * set cp to "" to make strcpy's and the like easier down below.
358 */ 358 */
359 if ((cp = strchr(buf,' '))!=NULL) { 359 if ((cp = strchr(buf,' '))!=NULL) {
360 while (*cp==' ') *cp++=0; 360 while (*cp==' ') *cp++=0;
361 has_val=1; 361 has_val=1;
362 } else { 362 } else {
363 cp=""; 363 cp="";
364 has_val=0; 364 has_val=0;
365 } 365 }
366 366
367 if (!strcasecmp(buf,"metaserver_notification")) { 367 if (!strcasecmp(buf,"metaserver_notification")) {
368 if (!strcasecmp(cp,"on") || !strcasecmp(cp,"true")) { 368 if (!strcasecmp(cp,"on") || !strcasecmp(cp,"true")) {
369 settings.meta_on=TRUE; 369 settings.meta_on=TRUE;
370 } else if (!strcasecmp(cp,"off") || !strcasecmp(cp,"false")) { 370 } else if (!strcasecmp(cp,"off") || !strcasecmp(cp,"false")) {
371 settings.meta_on=FALSE; 371 settings.meta_on=FALSE;
372 } else { 372 } else {
373 LOG(llevError,"load_settings: Unknown value for metaserver_notification: %s\n", 373 LOG(llevError,"load_settings: Unknown value for metaserver_notification: %s\n",
374 cp); 374 cp);
375 } 375 }
376 } else if (!strcasecmp(buf,"metaserver_server")) { 376 } else if (!strcasecmp(buf,"metaserver_server")) {
377 if (has_val) strcpy(settings.meta_server, cp); 377 if (has_val) strcpy(settings.meta_server, cp);
378 else 378 else
379 LOG(llevError,"load_settings: metaserver_server must have a value.\n"); 379 LOG(llevError,"load_settings: metaserver_server must have a value.\n");
380 } else if (!strcasecmp(buf,"motd")) { 380 } else if (!strcasecmp(buf,"motd")) {
381 if (has_val) 381 if (has_val)
382 strcpy(settings.motd, cp); 382 strcpy(settings.motd, cp);
383 else 383 else
384 LOG(llevError,"load_settings: motd must have a value.\n"); 384 LOG(llevError,"load_settings: motd must have a value.\n");
385 } else if (!strcasecmp(buf,"dm_mail")) { 385 } else if (!strcasecmp(buf,"dm_mail")) {
386 if (has_val) 386 if (has_val)
387 strcpy(settings.dm_mail, cp); 387 strcpy(settings.dm_mail, cp);
388 else 388 else
389 LOG(llevError,"load_settings: dm_mail must have a value.\n"); 389 LOG(llevError,"load_settings: dm_mail must have a value.\n");
390 } else if (!strcasecmp(buf,"metaserver_host")) { 390 } else if (!strcasecmp(buf,"metaserver_host")) {
391 if (has_val) strcpy(settings.meta_host, cp); 391 if (has_val) strcpy(settings.meta_host, cp);
392 else 392 else
393 LOG(llevError,"load_settings: metaserver_host must have a value.\n"); 393 LOG(llevError,"load_settings: metaserver_host must have a value.\n");
394 } else if (!strcasecmp(buf,"metaserver_port")) { 394 } else if (!strcasecmp(buf,"metaserver_port")) {
395 int port = atoi(cp); 395 int port = atoi(cp);
396 396
397 if (port<1 || port>65535) 397 if (port<1 || port>65535)
398 LOG(llevError,"load_settings: metaserver_port must be between 1 and 65535, %d is invalid\n", 398 LOG(llevError,"load_settings: metaserver_port must be between 1 and 65535, %d is invalid\n",
399 port); 399 port);
400 else settings.meta_port = port; 400 else settings.meta_port = port;
401 } else if (!strcasecmp(buf,"metaserver_comment")) { 401 } else if (!strcasecmp(buf,"metaserver_comment")) {
402 strcpy(settings.meta_comment, cp); 402 strcpy(settings.meta_comment, cp);
403 } else if (!strcasecmp(buf, "worldmapstartx")) { 403 } else if (!strcasecmp(buf, "worldmapstartx")) {
404 int size = atoi(cp); 404 int size = atoi(cp);
405 405
406 if (size < 0) 406 if (size < 0)
407 LOG(llevError, "load_settings: worldmapstartx must be at least " 407 LOG(llevError, "load_settings: worldmapstartx must be at least "
408 "0, %d is invalid\n", size); 408 "0, %d is invalid\n", size);
409 else 409 else
410 settings.worldmapstartx = size; 410 settings.worldmapstartx = size;
411 } else if (!strcasecmp(buf, "worldmapstarty")) { 411 } else if (!strcasecmp(buf, "worldmapstarty")) {
412 int size = atoi(cp); 412 int size = atoi(cp);
413 413
414 if (size < 0) 414 if (size < 0)
415 LOG(llevError, "load_settings: worldmapstarty must be at least " 415 LOG(llevError, "load_settings: worldmapstarty must be at least "
416 "0, %d is invalid\n", size); 416 "0, %d is invalid\n", size);
417 else 417 else
418 settings.worldmapstarty = size; 418 settings.worldmapstarty = size;
419 } else if (!strcasecmp(buf, "worldmaptilesx")) { 419 } else if (!strcasecmp(buf, "worldmaptilesx")) {
420 int size = atoi(cp); 420 int size = atoi(cp);
421 421
422 if (size < 1) 422 if (size < 1)
423 LOG(llevError, "load_settings: worldmaptilesx must be greater " 423 LOG(llevError, "load_settings: worldmaptilesx must be greater "
424 "than 1, %d is invalid\n", size); 424 "than 1, %d is invalid\n", size);
425 else 425 else
426 settings.worldmaptilesx = size; 426 settings.worldmaptilesx = size;
427 } else if (!strcasecmp(buf, "worldmaptilesy")) { 427 } else if (!strcasecmp(buf, "worldmaptilesy")) {
428 int size = atoi(cp); 428 int size = atoi(cp);
429 429
430 if (size < 1) 430 if (size < 1)
431 LOG(llevError, "load_settings: worldmaptilesy must be greater " 431 LOG(llevError, "load_settings: worldmaptilesy must be greater "
432 "than 1, %d is invalid\n", size); 432 "than 1, %d is invalid\n", size);
433 else 433 else
434 settings.worldmaptilesy = size; 434 settings.worldmaptilesy = size;
435 } else if (!strcasecmp(buf, "worldmaptilesizex")) { 435 } else if (!strcasecmp(buf, "worldmaptilesizex")) {
436 int size = atoi(cp); 436 int size = atoi(cp);
437 437
438 if (size < 1) 438 if (size < 1)
439 LOG(llevError, "load_settings: worldmaptilesizex must be " 439 LOG(llevError, "load_settings: worldmaptilesizex must be "
440 "greater than 1, %d is invalid\n", size); 440 "greater than 1, %d is invalid\n", size);
441 else 441 else
442 settings.worldmaptilesizex = size; 442 settings.worldmaptilesizex = size;
443 } else if (!strcasecmp(buf, "worldmaptilesizey")) { 443 } else if (!strcasecmp(buf, "worldmaptilesizey")) {
444 int size = atoi(cp); 444 int size = atoi(cp);
445 445
446 if (size < 1) 446 if (size < 1)
447 LOG(llevError, "load_settings: worldmaptilesizey must be " 447 LOG(llevError, "load_settings: worldmaptilesizey must be "
448 "greater than 1, %d is invalid\n", size); 448 "greater than 1, %d is invalid\n", size);
449 else 449 else
450 settings.worldmaptilesizey = size; 450 settings.worldmaptilesizey = size;
451 } else if (!strcasecmp(buf, "dynamiclevel")) { 451 } else if (!strcasecmp(buf, "dynamiclevel")) {
452 int lev = atoi(cp); 452 int lev = atoi(cp);
453 453
454 if (lev < 0) 454 if (lev < 0)
455 LOG(llevError, "load_settings: dynamiclevel must be " 455 LOG(llevError, "load_settings: dynamiclevel must be "
456 "at least 0, %d is invalid\n", lev); 456 "at least 0, %d is invalid\n", lev);
457 else 457 else
458 settings.dynamiclevel = lev; 458 settings.dynamiclevel = lev;
459 } else if (!strcasecmp(buf, "fastclock")) { 459 } else if (!strcasecmp(buf, "fastclock")) {
460 int lev = atoi(cp); 460 int lev = atoi(cp);
461 461
462 if (lev < 0) 462 if (lev < 0)
463 LOG(llevError, "load_settings: fastclock must be at least 0" 463 LOG(llevError, "load_settings: fastclock must be at least 0"
464 ", %d is invalid\n", lev); 464 ", %d is invalid\n", lev);
465 else 465 else
466 settings.fastclock = lev; 466 settings.fastclock = lev;
467 } else if (!strcasecmp(buf, "not_permadeth")) { 467 } else if (!strcasecmp(buf, "not_permadeth")) {
468 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 468 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
469 settings.not_permadeth=TRUE; 469 settings.not_permadeth=TRUE;
470 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 470 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
471 settings.not_permadeth=FALSE; 471 settings.not_permadeth=FALSE;
472 } else { 472 } else {
473 LOG(llevError, "load_settings: Unknown value for not_permadeth" 473 LOG(llevError, "load_settings: Unknown value for not_permadeth"
474 ": %s\n", cp); 474 ": %s\n", cp);
475 } 475 }
476 } else if (!strcasecmp(buf, "resurrection")) { 476 } else if (!strcasecmp(buf, "resurrection")) {
477 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 477 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
478 settings.resurrection=TRUE; 478 settings.resurrection=TRUE;
479 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 479 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
480 settings.resurrection=FALSE; 480 settings.resurrection=FALSE;
481 } else { 481 } else {
482 LOG(llevError, "load_settings: Unknown value for resurrection" 482 LOG(llevError, "load_settings: Unknown value for resurrection"
483 ": %s\n", cp); 483 ": %s\n", cp);
484 } 484 }
485 } else if (!strcasecmp(buf, "set_title")) { 485 } else if (!strcasecmp(buf, "set_title")) {
486 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 486 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
487 settings.set_title=TRUE; 487 settings.set_title=TRUE;
488 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 488 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
489 settings.set_title=FALSE; 489 settings.set_title=FALSE;
490 } else { 490 } else {
491 LOG(llevError, "load_settings: Unknown value for set_title" 491 LOG(llevError, "load_settings: Unknown value for set_title"
492 ": %s\n", cp); 492 ": %s\n", cp);
493 } 493 }
494 } else if (!strcasecmp(buf, "search_items")) { 494 } else if (!strcasecmp(buf, "search_items")) {
495 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 495 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
496 settings.search_items=TRUE; 496 settings.search_items=TRUE;
497 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 497 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
498 settings.search_items=FALSE; 498 settings.search_items=FALSE;
499 } else { 499 } else {
500 LOG(llevError, "load_settings: Unknown value for search_items" 500 LOG(llevError, "load_settings: Unknown value for search_items"
501 ": %s\n", cp); 501 ": %s\n", cp);
502 } 502 }
503 } else if (!strcasecmp(buf, "spell_encumbrance")) { 503 } else if (!strcasecmp(buf, "spell_encumbrance")) {
504 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 504 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
505 settings.spell_encumbrance=TRUE; 505 settings.spell_encumbrance=TRUE;
506 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 506 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
507 settings.spell_encumbrance=FALSE; 507 settings.spell_encumbrance=FALSE;
508 } else { 508 } else {
509 LOG(llevError, "load_settings: Unknown value for " 509 LOG(llevError, "load_settings: Unknown value for "
510 "spell_encumbrance: %s\n", cp); 510 "spell_encumbrance: %s\n", cp);
511 } 511 }
512 } else if (!strcasecmp(buf, "spell_failure_effects")) { 512 } else if (!strcasecmp(buf, "spell_failure_effects")) {
513 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 513 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
514 settings.spell_failure_effects=TRUE; 514 settings.spell_failure_effects=TRUE;
515 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 515 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
516 settings.spell_failure_effects=FALSE; 516 settings.spell_failure_effects=FALSE;
517 } else { 517 } else {
518 LOG(llevError, "load_settings: Unknown value for " 518 LOG(llevError, "load_settings: Unknown value for "
519 "spell_failure_effects: %s\n", cp); 519 "spell_failure_effects: %s\n", cp);
520 } 520 }
521 } else if (!strcasecmp(buf, "casting_time")) { 521 } else if (!strcasecmp(buf, "casting_time")) {
522 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 522 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
523 settings.casting_time=TRUE; 523 settings.casting_time=TRUE;
524 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 524 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
525 settings.casting_time=FALSE; 525 settings.casting_time=FALSE;
526 } else { 526 } else {
527 LOG(llevError, "load_settings: Unknown value for " 527 LOG(llevError, "load_settings: Unknown value for "
528 "casting_time: %s\n", cp); 528 "casting_time: %s\n", cp);
529 } 529 }
530 } else if (!strcasecmp(buf, "real_wiz")) { 530 } else if (!strcasecmp(buf, "real_wiz")) {
531 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 531 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
532 settings.real_wiz=TRUE; 532 settings.real_wiz=TRUE;
533 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 533 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
534 settings.real_wiz=FALSE; 534 settings.real_wiz=FALSE;
535 } else { 535 } else {
536 LOG(llevError, "load_settings: Unknown value for " 536 LOG(llevError, "load_settings: Unknown value for "
537 "real_wiz: %s\n", cp); 537 "real_wiz: %s\n", cp);
538 } 538 }
539 } else if (!strcasecmp(buf, "recycle_tmp_maps")) { 539 } else if (!strcasecmp(buf, "recycle_tmp_maps")) {
540 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 540 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
541 settings.recycle_tmp_maps=TRUE; 541 settings.recycle_tmp_maps=TRUE;
542 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 542 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
543 settings.recycle_tmp_maps=FALSE; 543 settings.recycle_tmp_maps=FALSE;
544 } else { 544 } else {
545 LOG(llevError, "load_settings: Unknown value for " 545 LOG(llevError, "load_settings: Unknown value for "
546 "recycle_tmp_maps: %s\n", cp); 546 "recycle_tmp_maps: %s\n", cp);
547 } 547 }
548 } else if (!strcasecmp(buf, "explore_mode")) { 548 } else if (!strcasecmp(buf, "explore_mode")) {
549 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 549 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
550 settings.explore_mode=TRUE; 550 settings.explore_mode=TRUE;
551 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 551 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
552 settings.explore_mode=FALSE; 552 settings.explore_mode=FALSE;
553 } else { 553 } else {
554 LOG(llevError, "load_settings: Unknown value for " 554 LOG(llevError, "load_settings: Unknown value for "
555 "explore_mode: %s\n", cp); 555 "explore_mode: %s\n", cp);
556 } 556 }
557 } else if (!strcasecmp(buf,"who_format")) { 557 } else if (!strcasecmp(buf,"who_format")) {
558 if (has_val) 558 if (has_val)
559 strcpy(settings.who_format, cp); 559 strcpy(settings.who_format, cp);
560 } else if (!strcasecmp(buf,"who_wiz_format")) { 560 } else if (!strcasecmp(buf,"who_wiz_format")) {
561 if (has_val) 561 if (has_val)
562 strcpy(settings.who_wiz_format, cp); 562 strcpy(settings.who_wiz_format, cp);
563 } else if (!strcasecmp(buf, "spellpoint_level_depend")) { 563 } else if (!strcasecmp(buf, "spellpoint_level_depend")) {
564 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 564 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
565 settings.spellpoint_level_depend=TRUE; 565 settings.spellpoint_level_depend=TRUE;
566 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 566 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
567 settings.spellpoint_level_depend=FALSE; 567 settings.spellpoint_level_depend=FALSE;
568 } else { 568 } else {
569 LOG(llevError, "load_settings: Unknown value for " 569 LOG(llevError, "load_settings: Unknown value for "
570 "spellpoint_level_depend: %s\n", cp); 570 "spellpoint_level_depend: %s\n", cp);
571 } 571 }
572 } else if (!strcasecmp(buf, "stat_loss_on_death")) { 572 } else if (!strcasecmp(buf, "stat_loss_on_death")) {
573 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 573 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
574 settings.stat_loss_on_death=TRUE; 574 settings.stat_loss_on_death=TRUE;
575 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 575 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
576 settings.stat_loss_on_death=FALSE; 576 settings.stat_loss_on_death=FALSE;
577 } else { 577 } else {
578 LOG(llevError, "load_settings: Unknown value for " 578 LOG(llevError, "load_settings: Unknown value for "
579 "stat_loss_on_death: %s\n", cp); 579 "stat_loss_on_death: %s\n", cp);
580 } 580 }
581 } else if (!strcasecmp(buf, "use_permanent_experience")) { 581 } else if (!strcasecmp(buf, "use_permanent_experience")) {
582 LOG(llevError, "use_permanent_experience is deprecated, use" 582 LOG(llevError, "use_permanent_experience is deprecated, use"
583 "permenent_experience_percentage instead\n"); 583 "permenent_experience_percentage instead\n");
584 } else if (!strcasecmp(buf, "permanent_experience_percentage")) { 584 } else if (!strcasecmp(buf, "permanent_experience_percentage")) {
585 int val = atoi(cp); 585 int val = atoi(cp);
586 if (val < 0 || val >100) 586 if (val < 0 || val >100)
587 LOG(llevError, "load_settings: permenent_experience_percentage" 587 LOG(llevError, "load_settings: permenent_experience_percentage"
588 "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 589 else
590 settings.permanent_exp_ratio = val; 590 settings.permanent_exp_ratio = val;
591 } else if (!strcasecmp(buf, "death_penalty_percentage")) { 591 } else if (!strcasecmp(buf, "death_penalty_percentage")) {
592 int val = atoi(cp); 592 int val = atoi(cp);
593 if (val < 0 || val >100) 593 if (val < 0 || val >100)
594 LOG(llevError, "load_settings: death_penalty_percentage" 594 LOG(llevError, "load_settings: death_penalty_percentage"
595 "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 596 else
597 settings.death_penalty_ratio = val; 597 settings.death_penalty_ratio = val;
598 } else if (!strcasecmp(buf, "death_penalty_levels")) { 598 } else if (!strcasecmp(buf, "death_penalty_levels")) {
599 int val = atoi(cp); 599 int val = atoi(cp);
600 if (val < 0 || val > 255) 600 if (val < 0 || val > 255)
601 LOG(llevError, "load_settings: death_penalty_levels" 601 LOG(llevError, "load_settings: death_penalty_levels"
602 "can not be negative, %d is invalid\n", val); 602 "can not be negative, %d is invalid\n", val);
603 else 603 else
604 settings.death_penalty_level = val; 604 settings.death_penalty_level = val;
605 }else if (!strcasecmp(buf, "balanced_stat_loss")) { 605 }else if (!strcasecmp(buf, "balanced_stat_loss")) {
606 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 606 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
607 settings.balanced_stat_loss=TRUE; 607 settings.balanced_stat_loss=TRUE;
608 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 608 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
609 settings.balanced_stat_loss=FALSE; 609 settings.balanced_stat_loss=FALSE;
610 } else { 610 } else {
611 LOG(llevError, "load_settings: Unknown value for " 611 LOG(llevError, "load_settings: Unknown value for "
612 "balanced_stat_loss: %s\n", cp); 612 "balanced_stat_loss: %s\n", cp);
613 } 613 }
614 } else if (!strcasecmp(buf,"simple_exp")) { 614 } else if (!strcasecmp(buf,"simple_exp")) {
615 if (!strcasecmp(cp,"on") || !strcasecmp(cp,"true")) { 615 if (!strcasecmp(cp,"on") || !strcasecmp(cp,"true")) {
616 settings.simple_exp=TRUE; 616 settings.simple_exp=TRUE;
617 } else if (!strcasecmp(cp,"off") || !strcasecmp(cp,"false")) { 617 } else if (!strcasecmp(cp,"off") || !strcasecmp(cp,"false")) {
618 settings.simple_exp=FALSE; 618 settings.simple_exp=FALSE;
619 } else { 619 } else {
620 LOG(llevError,"load_settings: Unknown value for simple_exp: %s\n", 620 LOG(llevError,"load_settings: Unknown value for simple_exp: %s\n",
621 cp); 621 cp);
622 } 622 }
623 } else if (!strcasecmp(buf, "item_power_factor")) { 623 } else if (!strcasecmp(buf, "item_power_factor")) {
624 float tmp = atof(cp); 624 float tmp = atof(cp);
625 if (tmp < 0) 625 if (tmp < 0)
626 LOG(llevError, "load_settings: item_power_factor must be a positive number (%f < 0)\n", 626 LOG(llevError, "load_settings: item_power_factor must be a positive number (%f < 0)\n",
627 tmp); 627 tmp);
628 else 628 else
629 settings.item_power_factor = tmp; 629 settings.item_power_factor = tmp;
630 } else if (!strcasecmp(buf, "pk_luck_penalty")) { 630 } else if (!strcasecmp(buf, "pk_luck_penalty")) {
631 sint16 val = atoi(cp); 631 sint16 val = atoi(cp);
632 632
633 if (val < -100 || val >100) 633 if (val < -100 || val >100)
634 LOG(llevError, "load_settings: pk_luck_penalty must be between -100 and 100" 634 LOG(llevError, "load_settings: pk_luck_penalty must be between -100 and 100"
635 ", %d is invalid\n", val); 635 ", %d is invalid\n", val);
636 else 636 else
637 settings.pk_luck_penalty = val; 637 settings.pk_luck_penalty = val;
638 } else if (!strcasecmp(buf, "set_friendly_fire")) { 638 } else if (!strcasecmp(buf, "set_friendly_fire")) {
639 int val = atoi(cp); 639 int val = atoi(cp);
640 640
641#if COZY_SERVER 641#if COZY_SERVER
642 if (val < 0 || val >100) 642 if (val < 0 || val >100)
643 LOG(llevError, "load_settings: set_friendly_fire must be between 0 an 100" 643 LOG(llevError, "load_settings: set_friendly_fire must be between 0 an 100"
644 ", %d is invalid\n", val); 644 ", %d is invalid\n", val);
645#else 645#else
646 if (val < 1 || val >100) 646 if (val < 1 || val >100)
647 LOG(llevError, "load_settings: set_friendly_fire must be between 1 an 100" 647 LOG(llevError, "load_settings: set_friendly_fire must be between 1 an 100"
648 ", %d is invalid\n", val); 648 ", %d is invalid\n", val);
649#endif 649#endif
650 else 650 else
651 settings.set_friendly_fire = val; 651 settings.set_friendly_fire = val;
652 } else if ( !strcasecmp( buf, "armor_max_enchant" ) ) { 652 } else if ( !strcasecmp( buf, "armor_max_enchant" ) ) {
653 int max_e = atoi( cp ); 653 int max_e = atoi( cp );
654 if ( max_e <= 0 ) 654 if ( max_e <= 0 )
655 LOG( llevError, "load_settings: armor_max_enchant is %d\n", max_e ); 655 LOG( llevError, "load_settings: armor_max_enchant is %d\n", max_e );
656 else 656 else
660 if ( wr < 0 ) 660 if ( wr < 0 )
661 LOG( llevError, "load_settings: armor_weight_reduction is %d\n", wr ); 661 LOG( llevError, "load_settings: armor_weight_reduction is %d\n", wr );
662 else 662 else
663 settings.armor_weight_reduction = wr; 663 settings.armor_weight_reduction = wr;
664 } else if ( !strcasecmp( buf, "armor_weight_linear" ) ) { 664 } else if ( !strcasecmp( buf, "armor_weight_linear" ) ) {
665 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 665 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
666 settings.armor_weight_linear=TRUE; 666 settings.armor_weight_linear=TRUE;
667 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 667 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
668 settings.armor_weight_linear=FALSE; 668 settings.armor_weight_linear=FALSE;
669 } else { 669 } else {
670 LOG(llevError, "load_settings: unknown value for armor_weight_linear: %s\n", cp); 670 LOG(llevError, "load_settings: unknown value for armor_weight_linear: %s\n", cp);
671 } 671 }
672 672
673 } else if ( !strcasecmp( buf, "armor_speed_improvement" ) ) { 673 } else if ( !strcasecmp( buf, "armor_speed_improvement" ) ) {
674 int wr = atoi( cp ); 674 int wr = atoi( cp );
675 if ( wr < 0 ) 675 if ( wr < 0 )
676 LOG( llevError, "load_settings: armor_speed_improvement is %d\n", wr ); 676 LOG( llevError, "load_settings: armor_speed_improvement is %d\n", wr );
677 else 677 else
678 settings.armor_speed_improvement = wr; 678 settings.armor_speed_improvement = wr;
679 } else if ( !strcasecmp( buf, "armor_speed_linear" ) ) { 679 } else if ( !strcasecmp( buf, "armor_speed_linear" ) ) {
680 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 680 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
681 settings.armor_speed_linear = TRUE; 681 settings.armor_speed_linear = TRUE;
682 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 682 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
683 settings.armor_speed_linear = FALSE; 683 settings.armor_speed_linear = FALSE;
684 } else { 684 } else {
685 LOG(llevError, "load_settings: unknown value for armor_speed_linear: %s\n", cp); 685 LOG(llevError, "load_settings: unknown value for armor_speed_linear: %s\n", cp);
686 } 686 }
687 687
688 } else if ( !strcasecmp( buf, "no_player_stealing" ) ) { 688 } else if ( !strcasecmp( buf, "no_player_stealing" ) ) {
689 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 689 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
690 settings.no_player_stealing = TRUE; 690 settings.no_player_stealing = TRUE;
691 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) { 691 } else if (!strcasecmp(cp, "off") || !strcasecmp(cp, "false")) {
692 settings.no_player_stealing = FALSE; 692 settings.no_player_stealing = FALSE;
693 } else { 693 } else {
694 LOG(llevError, "load_settings: unknown value for no_player_stealing: %s\n", cp); 694 LOG(llevError, "load_settings: unknown value for no_player_stealing: %s\n", cp);
695 } 695 }
696 696
697 } else if ( !strcasecmp( buf, "create_home_portals" ) ) { 697 } else if ( !strcasecmp( buf, "create_home_portals" ) ) {
698 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) { 698 if (!strcasecmp(cp, "on") || !strcasecmp(cp, "true")) {
699 settings.create_home_portals = TRUE; 699 settings.create_home_portals = TRUE;
702 } else { 702 } else {
703 LOG(llevError, "load_settings: Unknown value for create_home_portals: %s\n", cp); 703 LOG(llevError, "load_settings: Unknown value for create_home_portals: %s\n", cp);
704 } 704 }
705 705
706 } else { 706 } else {
707 LOG(llevError,"Unknown value in settings file: %s\n", buf); 707 LOG(llevError,"Unknown value in settings file: %s\n", buf);
708 } 708 }
709 } 709 }
710 close_and_delete(fp, comp); 710 close_and_delete(fp, comp);
711} 711}
712 712
713 713
718void init(int argc, char **argv) { 718void init(int argc, char **argv) {
719 719
720 init_done=0; /* Must be done before init_signal() */ 720 init_done=0; /* Must be done before init_signal() */
721 logfile=stderr; 721 logfile=stderr;
722 parse_args(argc, argv, 1); /* First arg pass - right now it does 722 parse_args(argc, argv, 1); /* First arg pass - right now it does
723 * nothing, but in future specifying the 723 * nothing, but in future specifying the
724 * LibDir in this pass would be reasonable*/ 724 * LibDir in this pass would be reasonable*/
725 725
726 init_library(); /* Must be called early */ 726 init_library(); /* Must be called early */
727 load_settings(); /* Load the settings file */ 727 load_settings(); /* Load the settings file */
728 init_weather(); 728 init_weather();
729 load_materials(); 729 load_materials();
731 fprintf(logfile,"Welcome to CrossFire, v%s\n",VERSION); 731 fprintf(logfile,"Welcome to CrossFire, v%s\n",VERSION);
732 fprintf(logfile,"Copyright (C) 1994 Mark Wedel.\n"); 732 fprintf(logfile,"Copyright (C) 1994 Mark Wedel.\n");
733 fprintf(logfile,"Copyright (C) 1992 Frank Tore Johansen.\n"); 733 fprintf(logfile,"Copyright (C) 1992 Frank Tore Johansen.\n");
734 734
735 if (strcmp(settings.dm_mail, "") != 0) { 735 if (strcmp(settings.dm_mail, "") != 0) {
736 fprintf(logfile,"Maintained locally by: %s\n", settings.dm_mail); 736 fprintf(logfile,"Maintained locally by: %s\n", settings.dm_mail);
737 fprintf(logfile,"Questions and bugs should be mailed to above address.\n"); 737 fprintf(logfile,"Questions and bugs should be mailed to above address.\n");
738 } 738 }
739 SRANDOM(time(NULL)); 739 SRANDOM(time(NULL));
740 740
741 init_startup(); /* Write (C), check shutdown/forbid files */ 741 init_startup(); /* Write (C), check shutdown/forbid files */
742 init_signals(); /* Sets up signal interceptions */ 742 init_signals(); /* Sets up signal interceptions */
746 746
747 parse_args(argc, argv, 3); 747 parse_args(argc, argv, 3);
748 748
749#ifndef WIN32 /* ***win32: no BecomeDaemon in windows */ 749#ifndef WIN32 /* ***win32: no BecomeDaemon in windows */
750 if (settings.daemonmode) 750 if (settings.daemonmode)
751 logfile = BecomeDaemon(settings.logfilename[0]=='\0'?"logfile":settings.logfilename); 751 logfile = BecomeDaemon(settings.logfilename[0]=='\0'?"logfile":settings.logfilename);
752#endif 752#endif
753 753
754 init_beforeplay(); 754 init_beforeplay();
755 init_ericserver(); 755 init_ericserver();
756 metaserver_init(); 756 metaserver_init();
757 init_done=1; 757 init_done=1;
758} 758}
759 759
760void usage(void) { 760void usage(void) {
761 (void) fprintf(logfile, 761 (void) fprintf(logfile,
762 "Usage: crossfire [-h] [-<flags>]...\n"); 762 "Usage: crossfire [-h] [-<flags>]...\n");
763} 763}
764 764
765void help(void) { 765void help(void) {
766/* The information in usage is redundant with what is given below, so why call it? */ 766/* The information in usage is redundant with what is given below, so why call it? */
767/* usage();*/ 767/* usage();*/
1033 cp++; 1033 cp++;
1034 } 1034 }
1035 if(sscanf(cp,"RACE %s",variable)) { /* set new race value */ 1035 if(sscanf(cp,"RACE %s",variable)) { /* set new race value */
1036 strcpy(race,variable); 1036 strcpy(race,variable);
1037 } else { 1037 } else {
1038 char *cp1; 1038 char *cp1;
1039 /* Take out beginning spaces */ 1039 /* Take out beginning spaces */
1040 for (cp1 = cp; *cp1==' '; cp1++); 1040 for (cp1 = cp; *cp1==' '; cp1++);
1041 /* Remove newline and trailing spaces */ 1041 /* Remove newline and trailing spaces */
1042 for (cp1 = cp + strlen(cp) -1; *cp1 == '\n' || *cp1 == ' '; cp1 --) { 1042 for (cp1 = cp + strlen(cp) -1; *cp1 == '\n' || *cp1 == ' '; cp1 --) {
1043 *cp1='\0'; 1043 *cp1='\0';
1044 if (cp==cp1) break; 1044 if (cp==cp1) break;
1045 } 1045 }
1046 1046
1047 if (cp[strlen(cp)-1]=='\n') cp[strlen(cp)-1]='\0'; 1047 if (cp[strlen(cp)-1]=='\n') cp[strlen(cp)-1]='\0';
1048 /* set creature race to race value */ 1048 /* set creature race to race value */
1049 if((mon=find_archetype(cp))==NULL) 1049 if((mon=find_archetype(cp))==NULL)
1050 LOG(llevError,"\nCreature %s in race file lacks archetype",cp); 1050 LOG(llevError,"\nCreature %s in race file lacks archetype",cp);
1051 else { 1051 else {
1052 if(set_race&&(!mon->clone.race||strcmp(mon->clone.race,race))) { 1052 if(set_race&&(!mon->clone.race||strcmp(mon->clone.race,race))) {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines