ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.23
Committed: Mon Jan 15 21:06:18 2007 UTC (17 years, 4 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.22: +22 -22 lines
Log Message:
comments

File Contents

# User Rev Content
1 elmex 1.1 /*
2 pippijn 1.23 * CrossFire, A Multiplayer game for X-windows
3     *
4     * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
5     * Copyright (C) 2002 Mark Wedel & Crossfire Development Team
6     * Copyright (C) 1992 Frank Tore Johansen
7     *
8     * This program is free software; you can redistribute it and/or modify
9     * it under the terms of the GNU General Public License as published by
10     * the Free Software Foundation; either version 2 of the License, or
11     * (at your option) any later version.
12     *
13     * This program is distributed in the hope that it will be useful,
14     * but WITHOUT ANY WARRANTY; without even the implied warranty of
15     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16     * GNU General Public License for more details.
17     *
18     * You should have received a copy of the GNU General Public License
19     * along with this program; if not, write to the Free Software
20     * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21     *
22     * The authors can be reached via e-mail at <crossfire@schmorp.de>
23     */
24 elmex 1.1
25 root 1.10 #define EXTERN // horrible hack
26 root 1.7
27 elmex 1.1 #include <global.h>
28     #include <object.h>
29    
30 root 1.10 extern const char *const attacktype_desc[NROFATTACKS] = {
31 root 1.11 # define def(uc, lc, name, plus, change) # name,
32     # include "attackinc.h"
33     # undef def
34 root 1.7 };
35    
36 root 1.10 extern const char *const resist_plus[NROFATTACKS] = {
37 root 1.11 # define def(uc, lc, name, plus, change) # plus,
38     # include "attackinc.h"
39     # undef def
40 root 1.7 };
41    
42 root 1.10 extern const char *const change_resist_msg[NROFATTACKS] = {
43 root 1.11 # define def(uc, lc, name, plus, change) # change,
44     # include "attackinc.h"
45     # undef def
46 root 1.7 };
47    
48     int resist_table[NROFATTACKS] = {
49 root 1.11 # define def(uc, lc, name, plus, change) ATNR_ ## uc,
50     # include "attackinc.h"
51     # undef def
52 root 1.7 };
53    
54 elmex 1.1 /* You unforunately need to looking in include/global.h to see what these
55     * correspond to.
56     */
57     struct Settings settings = {
58 root 1.10 LOGFILE, /* Logfile */
59     CSPORT, /* Client/server port */
60 elmex 1.1
61     /* Debug level */
62     #ifdef DEBUG
63     llevDebug,
64     #else
65     llevInfo,
66     #endif
67    
68 root 1.10 0, NULL, 0, /* dumpvalues, dumparg, daemonmode */
69     0, /* argc */
70     NULL, /* argv */
71     CONFDIR,
72     DATADIR,
73     LOCALDIR,
74     PLAYERDIR, MAPDIR, ARCHETYPES, REGIONS, TREASURES,
75     UNIQUE_DIR, TEMPLATE_DIR,
76     TMPDIR,
77     STAT_LOSS_ON_DEATH,
78     PK_LUCK_PENALTY,
79     PERMANENT_EXPERIENCE_RATIO,
80     DEATH_PENALTY_RATIO,
81     DEATH_PENALTY_LEVEL,
82     BALANCED_STAT_LOSS,
83     NOT_PERMADETH,
84     SIMPLE_EXP,
85     RESET_LOCATION_TIME,
86     SET_TITLE,
87     RESURRECTION,
88     SEARCH_ITEMS,
89     SPELL_ENCUMBRANCE,
90     SPELL_FAILURE_EFFECTS,
91     CASTING_TIME,
92     REAL_WIZ,
93     EXPLORE_MODE,
94     SPELLPOINT_LEVEL_DEPEND,
95     SET_FRIENDLY_FIRE,
96     MOTD,
97     "rules",
98     "news",
99     "", /* DM_MAIL */
100     0, 0, 0, 0, 0, 0, 0, 0, /* worldmap settings */
101     0,
102     1.0,
103    
104 elmex 1.1 /* Armor enchantment stuff */
105 root 1.10 ARMOR_MAX_ENCHANT,
106     ARMOR_WEIGHT_REDUCTION,
107     ARMOR_WEIGHT_LINEAR,
108     ARMOR_SPEED_IMPROVEMENT,
109     ARMOR_SPEED_LINEAR,
110     1, /* no_player_stealing */
111     1, /* create_home_portals */
112 elmex 1.1 };
113    
114     /* perhaps not the best place for this, but needs to be
115     * in some file in the common area so that standalone
116     * programs, like the random map generator, can be built.
117     */
118 root 1.10 const char *const spellpathnames[NRSPELLPATHS] = {
119     "Protection",
120     "Fire",
121     "Frost",
122     "Electricity",
123     "Missiles",
124     "Self",
125     "Summoning",
126     "Abjuration",
127     "Restoration",
128     "Detonation",
129     "Mind",
130     "Creation",
131     "Teleportation",
132     "Information",
133     "Transmutation",
134     "Transferrence",
135     "Turning",
136     "Wounding",
137     "Death",
138     "Light"
139 elmex 1.1 };
140    
141     /*
142     * It is vital that init_library() is called by any functions
143     * using this library.
144     * If you want to lessen the size of the program using the library,
145     * you can replace the call to init_library() with init_globals() and
146     * init_function_pointers(). Good idea to also call init_vars and
147     * init_hash_table if you are doing any object loading.
148     */
149 root 1.10 void
150     init_library (void)
151     {
152     init_environ ();
153     init_globals ();
154     init_vars ();
155     init_block ();
156     ReadBmapNames ();
157     ReadSmooth ();
158     init_anim (); /* Must be after we read in the bitmaps */
159     init_archetypes (); /* Reads all archetypes from file */
160     init_dynamic ();
161     init_attackmess ();
162     init_clocks ();
163     init_experience ();
164 elmex 1.1 }
165    
166    
167 pippijn 1.21 /* init_environ initialises values from the environmental variables.
168 elmex 1.1 * it needs to be called very early, since command line options should
169     * overwrite these if specified.
170     */
171 root 1.10 void
172     init_environ (void)
173     {
174     char *cp;
175 elmex 1.1
176 root 1.10 cp = getenv ("CROSSFIRE_LIBDIR");
177     if (cp)
178     settings.datadir = cp;
179     cp = getenv ("CROSSFIRE_LOCALDIR");
180     if (cp)
181     settings.localdir = cp;
182     cp = getenv ("CROSSFIRE_PLAYERDIR");
183     if (cp)
184     settings.playerdir = cp;
185     cp = getenv ("CROSSFIRE_MAPDIR");
186     if (cp)
187     settings.mapdir = cp;
188     cp = getenv ("CROSSFIRE_ARCHETYPES");
189     if (cp)
190     settings.archetypes = cp;
191     cp = getenv ("CROSSFIRE_TREASURES");
192     if (cp)
193     settings.treasures = cp;
194     cp = getenv ("CROSSFIRE_UNIQUEDIR");
195     if (cp)
196     settings.uniquedir = cp;
197     cp = getenv ("CROSSFIRE_TEMPLATEDIR");
198     if (cp)
199     settings.templatedir = cp;
200     cp = getenv ("CROSSFIRE_TMPDIR");
201     if (cp)
202     settings.tmpdir = cp;
203 elmex 1.1 }
204 root 1.10
205 elmex 1.1
206     /*
207     * Initialises all global variables.
208     * Might use environment-variables as default for some of them.
209     */
210    
211 root 1.10 void
212     init_globals (void)
213     {
214     if (settings.logfilename[0] == 0)
215 root 1.12 logfile = stderr;
216 root 1.10 else if ((logfile = fopen (settings.logfilename, "a")) == NULL)
217     {
218     fprintf (stderr, "Unable to open %s as the logfile - will use stderr instead\n", settings.logfilename);
219     logfile = stderr;
220 elmex 1.1 }
221 root 1.10 else
222 root 1.12 setvbuf (logfile, NULL, _IOLBF, 0);
223 elmex 1.1 }
224    
225 root 1.10 void
226     init_dynamic (void)
227     {
228     archetype *at = first_archetype;
229    
230     while (at)
231     {
232     if (at->clone.type == MAP)
233     {
234     if (at->clone.race)
235 root 1.19 first_map_ext_path = at->clone.race;
236 root 1.12
237 root 1.10 if (EXIT_PATH (&at->clone))
238     {
239 root 1.19 first_map_path = EXIT_PATH (&at->clone);
240 root 1.10 return;
241 elmex 1.1 }
242 root 1.2 }
243 root 1.12
244 root 1.10 at = at->next;
245 elmex 1.1 }
246 root 1.12
247 root 1.10 LOG (llevDebug, "You Need a archetype called 'map' and it have to contain start map\n");
248     exit (-1);
249 elmex 1.1 }
250    
251     unsigned long todtick;
252    
253     /*
254     * Write out the current time to the file so time does not
255     * reset every time the server reboots.
256     */
257    
258 root 1.10 void
259     write_todclock (void)
260 elmex 1.1 {
261 root 1.10 char filename[MAX_BUF];
262     FILE *fp;
263 elmex 1.1
264 root 1.10 sprintf (filename, "%s/clockdata", settings.localdir);
265     if ((fp = fopen (filename, "w")) == NULL)
266     {
267     LOG (llevError, "Cannot open %s for writing\n", filename);
268     return;
269 elmex 1.1 }
270 root 1.10 fprintf (fp, "%lu", todtick);
271     fclose (fp);
272 elmex 1.1 }
273    
274     /*
275 pippijn 1.21 * initialises the gametime and TOD counters
276 elmex 1.1 * Called by init_library().
277     */
278    
279 root 1.10 void
280     init_clocks (void)
281 elmex 1.1 {
282 root 1.10 char filename[MAX_BUF];
283     FILE *fp;
284     static int has_been_done = 0;
285    
286     if (has_been_done)
287     return;
288     else
289     has_been_done = 1;
290    
291     sprintf (filename, "%s/clockdata", settings.localdir);
292 pippijn 1.20 LOG (llevDebug, "Reading clockdata from %s...\n", filename);
293 root 1.10 if ((fp = fopen (filename, "r")) == NULL)
294     {
295     LOG (llevError, "Can't open %s.\n", filename);
296     todtick = 0;
297     write_todclock ();
298     return;
299 elmex 1.1 }
300 root 1.10 fscanf (fp, "%lu", &todtick);
301     LOG (llevDebug, "todtick=%lu\n", todtick);
302     fclose (fp);
303 elmex 1.1 }
304    
305     /*
306 pippijn 1.21 * initialises the attack messages.
307 elmex 1.1 * Called by init_library().
308     */
309    
310     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
311    
312 root 1.10 void
313     init_attackmess (void)
314     {
315     char buf[MAX_BUF];
316     char filename[MAX_BUF];
317     char *cp, *p;
318     FILE *fp;
319     static int has_been_done = 0;
320     int mess, level, comp;
321     int mode = 0, total = 0;
322    
323     if (has_been_done)
324     return;
325     else
326     has_been_done = 1;
327    
328     sprintf (filename, "%s/attackmess", settings.datadir);
329 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
330 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
331     {
332     LOG (llevError, "Can't open %s.\n", filename);
333     return;
334 elmex 1.1 }
335    
336 root 1.10 level = 0;
337     while (fgets (buf, MAX_BUF, fp) != NULL)
338     {
339     if (*buf == '#')
340     continue;
341     if ((cp = strchr (buf, '\n')) != NULL)
342     *cp = '\0';
343     cp = buf;
344     while (*cp == ' ') /* Skip blanks */
345     cp++;
346    
347     if (strncmp (cp, "TYPE:", 5) == 0)
348     {
349     p = strtok (buf, ":");
350     p = strtok (NULL, ":");
351     if (mode == 1)
352     {
353     attack_mess[mess][level].level = -1;
354     attack_mess[mess][level].buf1 = NULL;
355     attack_mess[mess][level].buf2 = NULL;
356     attack_mess[mess][level].buf3 = NULL;
357 root 1.2 }
358 root 1.10 level = 0;
359     mess = atoi (p);
360     mode = 1;
361     continue;
362     }
363     if (mode == 1)
364     {
365     p = strtok (buf, "=");
366     attack_mess[mess][level].level = atoi (buf);
367     p = strtok (NULL, "=");
368     if (p != NULL)
369 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
370 root 1.10 else
371 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
372 root 1.10 mode = 2;
373     continue;
374     }
375     else if (mode == 2)
376     {
377     p = strtok (buf, "=");
378     attack_mess[mess][level].level = atoi (buf);
379     p = strtok (NULL, "=");
380     if (p != NULL)
381 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
382 root 1.10 else
383 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
384 root 1.10 mode = 3;
385     continue;
386 root 1.2 }
387 root 1.10 else if (mode == 3)
388     {
389     p = strtok (buf, "=");
390     attack_mess[mess][level].level = atoi (buf);
391     p = strtok (NULL, "=");
392     if (p != NULL)
393 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
394 root 1.10 else
395 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
396 root 1.10 mode = 1;
397     level++;
398     total++;
399     continue;
400 root 1.2 }
401 elmex 1.1 }
402 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
403     close_and_delete (fp, comp);
404 elmex 1.1 }