ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.27
Committed: Tue Mar 6 19:02:35 2007 UTC (17 years, 2 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.26: +0 -1 lines
Log Message:
clean up makefiles, add dummy pod.pm

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     SET_TITLE,
86     RESURRECTION,
87     SEARCH_ITEMS,
88     SPELL_ENCUMBRANCE,
89     SPELL_FAILURE_EFFECTS,
90     CASTING_TIME,
91     REAL_WIZ,
92     EXPLORE_MODE,
93     SPELLPOINT_LEVEL_DEPEND,
94     SET_FRIENDLY_FIRE,
95     MOTD,
96     "rules",
97     "news",
98     "", /* DM_MAIL */
99     0, 0, 0, 0, 0, 0, 0, 0, /* worldmap settings */
100     0,
101     1.0,
102    
103 elmex 1.1 /* Armor enchantment stuff */
104 root 1.10 ARMOR_MAX_ENCHANT,
105     ARMOR_WEIGHT_REDUCTION,
106     ARMOR_WEIGHT_LINEAR,
107     ARMOR_SPEED_IMPROVEMENT,
108     ARMOR_SPEED_LINEAR,
109     1, /* no_player_stealing */
110     1, /* create_home_portals */
111 elmex 1.1 };
112    
113     /* perhaps not the best place for this, but needs to be
114     * in some file in the common area so that standalone
115     * programs, like the random map generator, can be built.
116     */
117 root 1.10 const char *const spellpathnames[NRSPELLPATHS] = {
118     "Protection",
119     "Fire",
120     "Frost",
121     "Electricity",
122     "Missiles",
123     "Self",
124     "Summoning",
125     "Abjuration",
126     "Restoration",
127     "Detonation",
128     "Mind",
129     "Creation",
130     "Teleportation",
131     "Information",
132     "Transmutation",
133     "Transferrence",
134     "Turning",
135     "Wounding",
136     "Death",
137     "Light"
138 elmex 1.1 };
139    
140     /*
141     * It is vital that init_library() is called by any functions
142     * using this library.
143     * If you want to lessen the size of the program using the library,
144     * you can replace the call to init_library() with init_globals() and
145     * init_function_pointers(). Good idea to also call init_vars and
146     * init_hash_table if you are doing any object loading.
147     */
148 root 1.10 void
149     init_library (void)
150     {
151     init_globals ();
152     init_block ();
153     ReadBmapNames ();
154     ReadSmooth ();
155     init_anim (); /* Must be after we read in the bitmaps */
156     init_archetypes (); /* Reads all archetypes from file */
157     init_dynamic ();
158     init_attackmess ();
159     init_clocks ();
160     init_experience ();
161 elmex 1.1 }
162    
163    
164 pippijn 1.21 /* init_environ initialises values from the environmental variables.
165 elmex 1.1 * it needs to be called very early, since command line options should
166     * overwrite these if specified.
167     */
168 root 1.10 void
169     init_environ (void)
170     {
171     char *cp;
172 elmex 1.1
173 root 1.10 cp = getenv ("CROSSFIRE_LIBDIR");
174     if (cp)
175     settings.datadir = cp;
176     cp = getenv ("CROSSFIRE_LOCALDIR");
177     if (cp)
178     settings.localdir = cp;
179     cp = getenv ("CROSSFIRE_PLAYERDIR");
180     if (cp)
181     settings.playerdir = cp;
182     cp = getenv ("CROSSFIRE_MAPDIR");
183     if (cp)
184     settings.mapdir = cp;
185     cp = getenv ("CROSSFIRE_ARCHETYPES");
186     if (cp)
187     settings.archetypes = cp;
188     cp = getenv ("CROSSFIRE_TREASURES");
189     if (cp)
190     settings.treasures = cp;
191     cp = getenv ("CROSSFIRE_UNIQUEDIR");
192     if (cp)
193     settings.uniquedir = cp;
194     cp = getenv ("CROSSFIRE_TEMPLATEDIR");
195     if (cp)
196     settings.templatedir = cp;
197     cp = getenv ("CROSSFIRE_TMPDIR");
198     if (cp)
199     settings.tmpdir = cp;
200 elmex 1.1 }
201 root 1.10
202 elmex 1.1 /*
203     * Initialises all global variables.
204     * Might use environment-variables as default for some of them.
205     */
206 root 1.10 void
207     init_globals (void)
208     {
209     if (settings.logfilename[0] == 0)
210 root 1.12 logfile = stderr;
211 root 1.10 else if ((logfile = fopen (settings.logfilename, "a")) == NULL)
212     {
213     fprintf (stderr, "Unable to open %s as the logfile - will use stderr instead\n", settings.logfilename);
214     logfile = stderr;
215 elmex 1.1 }
216 root 1.10 else
217 root 1.12 setvbuf (logfile, NULL, _IOLBF, 0);
218 elmex 1.1 }
219    
220 root 1.10 void
221     init_dynamic (void)
222     {
223     archetype *at = first_archetype;
224    
225     while (at)
226     {
227     if (at->clone.type == MAP)
228     {
229     if (at->clone.race)
230 root 1.19 first_map_ext_path = at->clone.race;
231 root 1.12
232 root 1.10 if (EXIT_PATH (&at->clone))
233     {
234 root 1.19 first_map_path = EXIT_PATH (&at->clone);
235 root 1.10 return;
236 elmex 1.1 }
237 root 1.2 }
238 root 1.12
239 root 1.10 at = at->next;
240 elmex 1.1 }
241 root 1.12
242 root 1.10 LOG (llevDebug, "You Need a archetype called 'map' and it have to contain start map\n");
243     exit (-1);
244 elmex 1.1 }
245    
246     unsigned long todtick;
247    
248     /*
249     * Write out the current time to the file so time does not
250     * reset every time the server reboots.
251     */
252 root 1.10 void
253     write_todclock (void)
254 elmex 1.1 {
255 root 1.10 char filename[MAX_BUF];
256     FILE *fp;
257 elmex 1.1
258 root 1.10 sprintf (filename, "%s/clockdata", settings.localdir);
259     if ((fp = fopen (filename, "w")) == NULL)
260     {
261     LOG (llevError, "Cannot open %s for writing\n", filename);
262     return;
263 elmex 1.1 }
264 root 1.10 fprintf (fp, "%lu", todtick);
265     fclose (fp);
266 elmex 1.1 }
267    
268     /*
269 pippijn 1.21 * initialises the gametime and TOD counters
270 elmex 1.1 * Called by init_library().
271     */
272 root 1.10 void
273     init_clocks (void)
274 elmex 1.1 {
275 root 1.10 char filename[MAX_BUF];
276     FILE *fp;
277     static int has_been_done = 0;
278    
279     if (has_been_done)
280     return;
281     else
282     has_been_done = 1;
283    
284     sprintf (filename, "%s/clockdata", settings.localdir);
285 pippijn 1.20 LOG (llevDebug, "Reading clockdata from %s...\n", filename);
286 root 1.10 if ((fp = fopen (filename, "r")) == NULL)
287     {
288     LOG (llevError, "Can't open %s.\n", filename);
289     todtick = 0;
290     write_todclock ();
291     return;
292 elmex 1.1 }
293 root 1.26
294 root 1.10 fscanf (fp, "%lu", &todtick);
295     LOG (llevDebug, "todtick=%lu\n", todtick);
296     fclose (fp);
297 elmex 1.1 }
298    
299     /*
300 pippijn 1.21 * initialises the attack messages.
301 elmex 1.1 * Called by init_library().
302     */
303    
304     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
305    
306 root 1.10 void
307     init_attackmess (void)
308     {
309     char buf[MAX_BUF];
310     char filename[MAX_BUF];
311     char *cp, *p;
312     FILE *fp;
313     static int has_been_done = 0;
314     int mess, level, comp;
315     int mode = 0, total = 0;
316    
317     if (has_been_done)
318     return;
319     else
320     has_been_done = 1;
321    
322     sprintf (filename, "%s/attackmess", settings.datadir);
323 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
324 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
325     {
326     LOG (llevError, "Can't open %s.\n", filename);
327     return;
328 elmex 1.1 }
329    
330 root 1.10 level = 0;
331     while (fgets (buf, MAX_BUF, fp) != NULL)
332     {
333     if (*buf == '#')
334     continue;
335     if ((cp = strchr (buf, '\n')) != NULL)
336     *cp = '\0';
337     cp = buf;
338     while (*cp == ' ') /* Skip blanks */
339     cp++;
340    
341     if (strncmp (cp, "TYPE:", 5) == 0)
342     {
343     p = strtok (buf, ":");
344     p = strtok (NULL, ":");
345     if (mode == 1)
346     {
347     attack_mess[mess][level].level = -1;
348     attack_mess[mess][level].buf1 = NULL;
349     attack_mess[mess][level].buf2 = NULL;
350     attack_mess[mess][level].buf3 = NULL;
351 root 1.2 }
352 root 1.10 level = 0;
353     mess = atoi (p);
354     mode = 1;
355     continue;
356     }
357     if (mode == 1)
358     {
359     p = strtok (buf, "=");
360     attack_mess[mess][level].level = atoi (buf);
361     p = strtok (NULL, "=");
362     if (p != NULL)
363 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
364 root 1.10 else
365 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
366 root 1.10 mode = 2;
367     continue;
368     }
369     else if (mode == 2)
370     {
371     p = strtok (buf, "=");
372     attack_mess[mess][level].level = atoi (buf);
373     p = strtok (NULL, "=");
374     if (p != NULL)
375 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
376 root 1.10 else
377 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
378 root 1.10 mode = 3;
379     continue;
380 root 1.2 }
381 root 1.10 else if (mode == 3)
382     {
383     p = strtok (buf, "=");
384     attack_mess[mess][level].level = atoi (buf);
385     p = strtok (NULL, "=");
386     if (p != NULL)
387 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
388 root 1.10 else
389 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
390 root 1.10 mode = 1;
391     level++;
392     total++;
393     continue;
394 root 1.2 }
395 elmex 1.1 }
396 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
397     close_and_delete (fp, comp);
398 elmex 1.1 }