ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.26
Committed: Tue Mar 6 14:01:10 2007 UTC (17 years, 3 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_0
Changes since 1.25: +1 -4 lines
Log Message:
*** empty log message ***

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_globals ();
153     init_block ();
154     ReadBmapNames ();
155     ReadSmooth ();
156     init_anim (); /* Must be after we read in the bitmaps */
157     init_archetypes (); /* Reads all archetypes from file */
158     init_dynamic ();
159     init_attackmess ();
160     init_clocks ();
161     init_experience ();
162 elmex 1.1 }
163    
164    
165 pippijn 1.21 /* init_environ initialises values from the environmental variables.
166 elmex 1.1 * it needs to be called very early, since command line options should
167     * overwrite these if specified.
168     */
169 root 1.10 void
170     init_environ (void)
171     {
172     char *cp;
173 elmex 1.1
174 root 1.10 cp = getenv ("CROSSFIRE_LIBDIR");
175     if (cp)
176     settings.datadir = cp;
177     cp = getenv ("CROSSFIRE_LOCALDIR");
178     if (cp)
179     settings.localdir = cp;
180     cp = getenv ("CROSSFIRE_PLAYERDIR");
181     if (cp)
182     settings.playerdir = cp;
183     cp = getenv ("CROSSFIRE_MAPDIR");
184     if (cp)
185     settings.mapdir = cp;
186     cp = getenv ("CROSSFIRE_ARCHETYPES");
187     if (cp)
188     settings.archetypes = cp;
189     cp = getenv ("CROSSFIRE_TREASURES");
190     if (cp)
191     settings.treasures = cp;
192     cp = getenv ("CROSSFIRE_UNIQUEDIR");
193     if (cp)
194     settings.uniquedir = cp;
195     cp = getenv ("CROSSFIRE_TEMPLATEDIR");
196     if (cp)
197     settings.templatedir = cp;
198     cp = getenv ("CROSSFIRE_TMPDIR");
199     if (cp)
200     settings.tmpdir = cp;
201 elmex 1.1 }
202 root 1.10
203 elmex 1.1 /*
204     * Initialises all global variables.
205     * Might use environment-variables as default for some of them.
206     */
207 root 1.10 void
208     init_globals (void)
209     {
210     if (settings.logfilename[0] == 0)
211 root 1.12 logfile = stderr;
212 root 1.10 else if ((logfile = fopen (settings.logfilename, "a")) == NULL)
213     {
214     fprintf (stderr, "Unable to open %s as the logfile - will use stderr instead\n", settings.logfilename);
215     logfile = stderr;
216 elmex 1.1 }
217 root 1.10 else
218 root 1.12 setvbuf (logfile, NULL, _IOLBF, 0);
219 elmex 1.1 }
220    
221 root 1.10 void
222     init_dynamic (void)
223     {
224     archetype *at = first_archetype;
225    
226     while (at)
227     {
228     if (at->clone.type == MAP)
229     {
230     if (at->clone.race)
231 root 1.19 first_map_ext_path = at->clone.race;
232 root 1.12
233 root 1.10 if (EXIT_PATH (&at->clone))
234     {
235 root 1.19 first_map_path = EXIT_PATH (&at->clone);
236 root 1.10 return;
237 elmex 1.1 }
238 root 1.2 }
239 root 1.12
240 root 1.10 at = at->next;
241 elmex 1.1 }
242 root 1.12
243 root 1.10 LOG (llevDebug, "You Need a archetype called 'map' and it have to contain start map\n");
244     exit (-1);
245 elmex 1.1 }
246    
247     unsigned long todtick;
248    
249     /*
250     * Write out the current time to the file so time does not
251     * reset every time the server reboots.
252     */
253 root 1.10 void
254     write_todclock (void)
255 elmex 1.1 {
256 root 1.10 char filename[MAX_BUF];
257     FILE *fp;
258 elmex 1.1
259 root 1.10 sprintf (filename, "%s/clockdata", settings.localdir);
260     if ((fp = fopen (filename, "w")) == NULL)
261     {
262     LOG (llevError, "Cannot open %s for writing\n", filename);
263     return;
264 elmex 1.1 }
265 root 1.10 fprintf (fp, "%lu", todtick);
266     fclose (fp);
267 elmex 1.1 }
268    
269     /*
270 pippijn 1.21 * initialises the gametime and TOD counters
271 elmex 1.1 * Called by init_library().
272     */
273 root 1.10 void
274     init_clocks (void)
275 elmex 1.1 {
276 root 1.10 char filename[MAX_BUF];
277     FILE *fp;
278     static int has_been_done = 0;
279    
280     if (has_been_done)
281     return;
282     else
283     has_been_done = 1;
284    
285     sprintf (filename, "%s/clockdata", settings.localdir);
286 pippijn 1.20 LOG (llevDebug, "Reading clockdata from %s...\n", filename);
287 root 1.10 if ((fp = fopen (filename, "r")) == NULL)
288     {
289     LOG (llevError, "Can't open %s.\n", filename);
290     todtick = 0;
291     write_todclock ();
292     return;
293 elmex 1.1 }
294 root 1.26
295 root 1.10 fscanf (fp, "%lu", &todtick);
296     LOG (llevDebug, "todtick=%lu\n", todtick);
297     fclose (fp);
298 elmex 1.1 }
299    
300     /*
301 pippijn 1.21 * initialises the attack messages.
302 elmex 1.1 * Called by init_library().
303     */
304    
305     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
306    
307 root 1.10 void
308     init_attackmess (void)
309     {
310     char buf[MAX_BUF];
311     char filename[MAX_BUF];
312     char *cp, *p;
313     FILE *fp;
314     static int has_been_done = 0;
315     int mess, level, comp;
316     int mode = 0, total = 0;
317    
318     if (has_been_done)
319     return;
320     else
321     has_been_done = 1;
322    
323     sprintf (filename, "%s/attackmess", settings.datadir);
324 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
325 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
326     {
327     LOG (llevError, "Can't open %s.\n", filename);
328     return;
329 elmex 1.1 }
330    
331 root 1.10 level = 0;
332     while (fgets (buf, MAX_BUF, fp) != NULL)
333     {
334     if (*buf == '#')
335     continue;
336     if ((cp = strchr (buf, '\n')) != NULL)
337     *cp = '\0';
338     cp = buf;
339     while (*cp == ' ') /* Skip blanks */
340     cp++;
341    
342     if (strncmp (cp, "TYPE:", 5) == 0)
343     {
344     p = strtok (buf, ":");
345     p = strtok (NULL, ":");
346     if (mode == 1)
347     {
348     attack_mess[mess][level].level = -1;
349     attack_mess[mess][level].buf1 = NULL;
350     attack_mess[mess][level].buf2 = NULL;
351     attack_mess[mess][level].buf3 = NULL;
352 root 1.2 }
353 root 1.10 level = 0;
354     mess = atoi (p);
355     mode = 1;
356     continue;
357     }
358     if (mode == 1)
359     {
360     p = strtok (buf, "=");
361     attack_mess[mess][level].level = atoi (buf);
362     p = strtok (NULL, "=");
363     if (p != NULL)
364 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
365 root 1.10 else
366 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
367 root 1.10 mode = 2;
368     continue;
369     }
370     else if (mode == 2)
371     {
372     p = strtok (buf, "=");
373     attack_mess[mess][level].level = atoi (buf);
374     p = strtok (NULL, "=");
375     if (p != NULL)
376 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
377 root 1.10 else
378 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
379 root 1.10 mode = 3;
380     continue;
381 root 1.2 }
382 root 1.10 else if (mode == 3)
383     {
384     p = strtok (buf, "=");
385     attack_mess[mess][level].level = atoi (buf);
386     p = strtok (NULL, "=");
387     if (p != NULL)
388 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
389 root 1.10 else
390 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
391 root 1.10 mode = 1;
392     level++;
393     total++;
394     continue;
395 root 1.2 }
396 elmex 1.1 }
397 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
398     close_and_delete (fp, comp);
399 elmex 1.1 }