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.11 by root, Wed Sep 13 02:05:18 2006 UTC vs.
Revision 1.22 by pippijn, Sat Jan 6 14:42:28 2007 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines