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.15 by root, Mon Oct 2 15:28:36 2006 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines