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

Comparing deliantra/server/common/init.C (file contents):
Revision 1.10 by root, Sun Sep 10 16:00:23 2006 UTC vs.
Revision 1.22 by pippijn, Sat Jan 6 14:42:28 2007 UTC

1
2/*
3 * static char *rcsid_init_c =
4 * "$Id: init.C,v 1.10 2006/09/10 16:00:23 root Exp $";
5 */
6
7/* 1/*
8 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
9 3
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
10 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
11 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
12 7
13 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
22 17
23 You should have received a copy of the GNU General Public License 18 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 21
27 The authors can be reached via e-mail at crossfire-devel@real-time.com 22 The authors can be reached via e-mail at <crossfire@schmorp.de>
28*/ 23*/
29 24
30#define EXTERN // horrible hack 25#define EXTERN // horrible hack
31 26
32#include <global.h> 27#include <global.h>
33#include <object.h> 28#include <object.h>
34 29
35extern const char *const attacktype_desc[NROFATTACKS] = { 30extern const char *const attacktype_desc[NROFATTACKS] = {
36#define def(uc, lc, name, plus, change) # name, 31# define def(uc, lc, name, plus, change) # name,
37#include "attackinc.h" 32# include "attackinc.h"
38#undef def 33# undef def
39};
40
41extern const keyword resist_save[NROFATTACKS] = {
42#define def(uc, lc, name, plus, change) KW_resist_ ## lc,
43#include "attackinc.h"
44#undef def
45}; 34};
46 35
47extern const char *const resist_plus[NROFATTACKS] = { 36extern const char *const resist_plus[NROFATTACKS] = {
48#define def(uc, lc, name, plus, change) # plus, 37# define def(uc, lc, name, plus, change) # plus,
49#include "attackinc.h" 38# include "attackinc.h"
50#undef def 39# undef def
51}; 40};
52 41
53extern const char *const change_resist_msg[NROFATTACKS] = { 42extern const char *const change_resist_msg[NROFATTACKS] = {
54#define def(uc, lc, name, plus, change) # change, 43# define def(uc, lc, name, plus, change) # change,
55#include "attackinc.h" 44# include "attackinc.h"
56#undef def 45# undef def
57}; 46};
58 47
59int resist_table[NROFATTACKS] = { 48int resist_table[NROFATTACKS] = {
60#define def(uc, lc, name, plus, change) ATNR_ ## uc, 49# define def(uc, lc, name, plus, change) ATNR_ ## uc,
61#include "attackinc.h" 50# include "attackinc.h"
62#undef def 51# undef def
63}; 52};
64 53
65/* You unforunately need to looking in include/global.h to see what these 54/* You unforunately need to looking in include/global.h to see what these
66 * correspond to. 55 * correspond to.
67 */ 56 */
99 SEARCH_ITEMS, 88 SEARCH_ITEMS,
100 SPELL_ENCUMBRANCE, 89 SPELL_ENCUMBRANCE,
101 SPELL_FAILURE_EFFECTS, 90 SPELL_FAILURE_EFFECTS,
102 CASTING_TIME, 91 CASTING_TIME,
103 REAL_WIZ, 92 REAL_WIZ,
104 RECYCLE_TMP_MAPS,
105 EXPLORE_MODE, 93 EXPLORE_MODE,
106 SPELLPOINT_LEVEL_DEPEND, 94 SPELLPOINT_LEVEL_DEPEND,
107 SET_FRIENDLY_FIRE, 95 SET_FRIENDLY_FIRE,
108 "", /* Who format specifier */
109 "", /* who wiz format specifier */
110 MOTD, 96 MOTD,
111 "rules", 97 "rules",
112 "news", 98 "news",
113 "", /* DM_MAIL */ 99 "", /* DM_MAIL */
114 0, /* This and the next 3 values are metaserver values */
115 "",
116 "",
117 0,
118 "",
119 0, 0, 0, 0, 0, 0, 0, 0, /* worldmap settings */ 100 0, 0, 0, 0, 0, 0, 0, 0, /* worldmap settings */
120 EMERGENCY_MAPPATH, EMERGENCY_X, EMERGENCY_Y,
121 0, 101 0,
122 1.0, 102 1.0,
123 103
124/* Armor enchantment stuff */ 104/* Armor enchantment stuff */
125 ARMOR_MAX_ENCHANT, 105 ARMOR_MAX_ENCHANT,
156 "Wounding", 136 "Wounding",
157 "Death", 137 "Death",
158 "Light" 138 "Light"
159}; 139};
160 140
161
162/* This loads the emergency map information from a
163 * .emergency file in the map directory. Doing this makes
164 * it easier to switch between map distributions (don't need
165 * to recompile. Note that there is no reason I see that
166 * this could not be re-loaded during play, but it seems
167 * like there should be little reason to do that.
168 */
169static void
170init_emergency_mappath (void)
171{
172 char filename[MAX_BUF], tmpbuf[MAX_BUF];
173 FILE *fp;
174 int online = 0;
175
176 /* If this file doesn't exist, not a big deal */
177 sprintf (filename, "%s/%s/.emergency", settings.datadir, settings.mapdir);
178 if ((fp = fopen (filename, "r")) != NULL)
179 {
180 while (fgets (tmpbuf, MAX_BUF - 1, fp))
181 {
182 if (tmpbuf[0] == '#')
183 continue; /* ignore comments */
184
185 if (online == 0)
186 {
187 tmpbuf[strlen (tmpbuf) - 1] = 0; /* kill newline */
188 settings.emergency_mapname = strdup_local (tmpbuf);
189 }
190 else if (online == 1)
191 {
192 settings.emergency_x = atoi (tmpbuf);
193 }
194
195 else if (online == 2)
196 {
197 settings.emergency_y = atoi (tmpbuf);
198 }
199 online++;
200 if (online > 2)
201 break;
202 }
203 fclose (fp);
204 if (online <= 2)
205 LOG (llevError, "Online read partial data from %s\n", filename);
206 LOG (llevDebug, "Emergency mappath reset to %s (%d, %d)\n", settings.emergency_mapname, settings.emergency_x, settings.emergency_y);
207 }
208}
209
210
211/* 141/*
212 * It is vital that init_library() is called by any functions 142 * It is vital that init_library() is called by any functions
213 * using this library. 143 * using this library.
214 * If you want to lessen the size of the program using the library, 144 * If you want to lessen the size of the program using the library,
215 * you can replace the call to init_library() with init_globals() and 145 * you can replace the call to init_library() with init_globals() and
216 * init_function_pointers(). Good idea to also call init_vars and 146 * init_function_pointers(). Good idea to also call init_vars and
217 * init_hash_table if you are doing any object loading. 147 * init_hash_table if you are doing any object loading.
218 */ 148 */
219
220void 149void
221init_library (void) 150init_library (void)
222{ 151{
223 init_environ (); 152 init_environ ();
224 init_globals (); 153 init_globals ();
225 init_objects ();
226 init_vars (); 154 init_vars ();
227 init_block (); 155 init_block ();
228 ReadBmapNames (); 156 ReadBmapNames ();
229 ReadSmooth (); 157 ReadSmooth ();
230 init_anim (); /* Must be after we read in the bitmaps */ 158 init_anim (); /* Must be after we read in the bitmaps */
231 init_archetypes (); /* Reads all archetypes from file */ 159 init_archetypes (); /* Reads all archetypes from file */
232 init_dynamic (); 160 init_dynamic ();
233 init_attackmess (); 161 init_attackmess ();
234 init_clocks (); 162 init_clocks ();
235 init_emergency_mappath ();
236 init_experience (); 163 init_experience ();
237} 164}
238 165
239 166
240/* init_environ initializes values from the environmental variables. 167/* init_environ initialises values from the environmental variables.
241 * it needs to be called very early, since command line options should 168 * it needs to be called very early, since command line options should
242 * overwrite these if specified. 169 * overwrite these if specified.
243 */ 170 */
244void 171void
245init_environ (void) 172init_environ (void)
283 210
284void 211void
285init_globals (void) 212init_globals (void)
286{ 213{
287 if (settings.logfilename[0] == 0) 214 if (settings.logfilename[0] == 0)
288 {
289 logfile = stderr; 215 logfile = stderr;
290 }
291 else if ((logfile = fopen (settings.logfilename, "a")) == NULL) 216 else if ((logfile = fopen (settings.logfilename, "a")) == NULL)
292 { 217 {
293 fprintf (stderr, "Unable to open %s as the logfile - will use stderr instead\n", settings.logfilename); 218 fprintf (stderr, "Unable to open %s as the logfile - will use stderr instead\n", settings.logfilename);
294 logfile = stderr; 219 logfile = stderr;
295 } 220 }
296 else 221 else
297 {
298 setvbuf (logfile, NULL, _IOLBF, 0); 222 setvbuf (logfile, NULL, _IOLBF, 0);
299 }
300 exiting = 0;
301 first_player = NULL;
302 first_friendly_object = NULL;
303 first_map = NULL;
304 first_treasurelist = NULL;
305 first_artifactlist = NULL;
306 first_archetype = NULL;
307 *first_map_ext_path = 0;
308 warn_archetypes = 0;
309 nroftreasures = 0;
310 nrofartifacts = 0;
311 nrofallowedstr = 0;
312 ring_arch = NULL;
313 amulet_arch = NULL;
314 staff_arch = NULL;
315 trying_emergency_save = 0;
316 num_animations = 0;
317 animations_allocated = 0;
318 init_defaults ();
319} 223}
320
321/*
322 * Sets up and initialises the linked list of free and used objects.
323 * Allocates a certain chunk of objects and puts them on the free list.
324 * Called by init_library();
325 */
326
327void
328init_objects (void)
329{
330 /* Initialize all objects: */
331 objects = NULL;
332 active_objects = NULL;
333}
334
335/*
336 * Initialises global variables which can be changed by options.
337 * Called by init_library().
338 */
339
340void
341init_defaults (void)
342{
343 editor = 0;
344 nroferrors = 0;
345}
346
347 224
348void 225void
349init_dynamic (void) 226init_dynamic (void)
350{ 227{
351 archetype *at = first_archetype; 228 archetype *at = first_archetype;
353 while (at) 230 while (at)
354 { 231 {
355 if (at->clone.type == MAP) 232 if (at->clone.type == MAP)
356 { 233 {
357 if (at->clone.race) 234 if (at->clone.race)
358 {
359 strcpy (first_map_ext_path, at->clone.race); 235 first_map_ext_path = at->clone.race;
360 } 236
361 if (EXIT_PATH (&at->clone)) 237 if (EXIT_PATH (&at->clone))
362 { 238 {
363 strcpy (first_map_path, EXIT_PATH (&at->clone)); 239 first_map_path = EXIT_PATH (&at->clone);
364 return; 240 return;
365 } 241 }
366 } 242 }
243
367 at = at->next; 244 at = at->next;
368 } 245 }
246
369 LOG (llevDebug, "You Need a archetype called 'map' and it have to contain start map\n"); 247 LOG (llevDebug, "You Need a archetype called 'map' and it have to contain start map\n");
370 exit (-1); 248 exit (-1);
371} 249}
372 250
373unsigned long todtick; 251unsigned long todtick;
392 fprintf (fp, "%lu", todtick); 270 fprintf (fp, "%lu", todtick);
393 fclose (fp); 271 fclose (fp);
394} 272}
395 273
396/* 274/*
397 * Initializes the gametime and TOD counters 275 * initialises the gametime and TOD counters
398 * Called by init_library(). 276 * Called by init_library().
399 */ 277 */
400 278
401void 279void
402init_clocks (void) 280init_clocks (void)
409 return; 287 return;
410 else 288 else
411 has_been_done = 1; 289 has_been_done = 1;
412 290
413 sprintf (filename, "%s/clockdata", settings.localdir); 291 sprintf (filename, "%s/clockdata", settings.localdir);
414 LOG (llevDebug, "Reading clockdata from %s...", filename); 292 LOG (llevDebug, "Reading clockdata from %s...\n", filename);
415 if ((fp = fopen (filename, "r")) == NULL) 293 if ((fp = fopen (filename, "r")) == NULL)
416 { 294 {
417 LOG (llevError, "Can't open %s.\n", filename); 295 LOG (llevError, "Can't open %s.\n", filename);
418 todtick = 0; 296 todtick = 0;
419 write_todclock (); 297 write_todclock ();
423 LOG (llevDebug, "todtick=%lu\n", todtick); 301 LOG (llevDebug, "todtick=%lu\n", todtick);
424 fclose (fp); 302 fclose (fp);
425} 303}
426 304
427/* 305/*
428 * Initializes the attack messages. 306 * initialises the attack messages.
429 * Called by init_library(). 307 * Called by init_library().
430 */ 308 */
431 309
432//attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS]; 310//attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
433 311
446 return; 324 return;
447 else 325 else
448 has_been_done = 1; 326 has_been_done = 1;
449 327
450 sprintf (filename, "%s/attackmess", settings.datadir); 328 sprintf (filename, "%s/attackmess", settings.datadir);
451 LOG (llevDebug, "Reading attack messages from %s...", filename); 329 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
452 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL) 330 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
453 { 331 {
454 LOG (llevError, "Can't open %s.\n", filename); 332 LOG (llevError, "Can't open %s.\n", filename);
455 return; 333 return;
456 } 334 }
486 { 364 {
487 p = strtok (buf, "="); 365 p = strtok (buf, "=");
488 attack_mess[mess][level].level = atoi (buf); 366 attack_mess[mess][level].level = atoi (buf);
489 p = strtok (NULL, "="); 367 p = strtok (NULL, "=");
490 if (p != NULL) 368 if (p != NULL)
491 attack_mess[mess][level].buf1 = strdup_local (p); 369 attack_mess[mess][level].buf1 = strdup (p);
492 else 370 else
493 attack_mess[mess][level].buf1 = strdup_local (""); 371 attack_mess[mess][level].buf1 = strdup ("");
494 mode = 2; 372 mode = 2;
495 continue; 373 continue;
496 } 374 }
497 else if (mode == 2) 375 else if (mode == 2)
498 { 376 {
499 p = strtok (buf, "="); 377 p = strtok (buf, "=");
500 attack_mess[mess][level].level = atoi (buf); 378 attack_mess[mess][level].level = atoi (buf);
501 p = strtok (NULL, "="); 379 p = strtok (NULL, "=");
502 if (p != NULL) 380 if (p != NULL)
503 attack_mess[mess][level].buf2 = strdup_local (p); 381 attack_mess[mess][level].buf2 = strdup (p);
504 else 382 else
505 attack_mess[mess][level].buf2 = strdup_local (""); 383 attack_mess[mess][level].buf2 = strdup ("");
506 mode = 3; 384 mode = 3;
507 continue; 385 continue;
508 } 386 }
509 else if (mode == 3) 387 else if (mode == 3)
510 { 388 {
511 p = strtok (buf, "="); 389 p = strtok (buf, "=");
512 attack_mess[mess][level].level = atoi (buf); 390 attack_mess[mess][level].level = atoi (buf);
513 p = strtok (NULL, "="); 391 p = strtok (NULL, "=");
514 if (p != NULL) 392 if (p != NULL)
515 attack_mess[mess][level].buf3 = strdup_local (p); 393 attack_mess[mess][level].buf3 = strdup (p);
516 else 394 else
517 attack_mess[mess][level].buf3 = strdup_local (""); 395 attack_mess[mess][level].buf3 = strdup ("");
518 mode = 1; 396 mode = 1;
519 level++; 397 level++;
520 total++; 398 total++;
521 continue; 399 continue;
522 } 400 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines