ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.19
Committed: Sun Dec 31 21:02:04 2006 UTC (17 years, 4 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.18: +2 -2 lines
Log Message:
more use of shstr where it makes sense naturally

File Contents

# User Rev Content
1 elmex 1.1 /*
2     CrossFire, A Multiplayer game for X-windows
3    
4     Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5     Copyright (C) 1992 Frank Tore Johansen
6    
7     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     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11    
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16    
17     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     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20    
21 root 1.13 The authors can be reached via e-mail at <crossfire@schmorp.de>
22 elmex 1.1 */
23    
24 root 1.10 #define EXTERN // horrible hack
25 root 1.7
26 elmex 1.1 #include <global.h>
27     #include <object.h>
28    
29 root 1.10 extern const char *const attacktype_desc[NROFATTACKS] = {
30 root 1.11 # define def(uc, lc, name, plus, change) # name,
31     # include "attackinc.h"
32     # undef def
33 root 1.7 };
34    
35 root 1.10 extern const char *const resist_plus[NROFATTACKS] = {
36 root 1.11 # define def(uc, lc, name, plus, change) # plus,
37     # include "attackinc.h"
38     # undef def
39 root 1.7 };
40    
41 root 1.10 extern const char *const change_resist_msg[NROFATTACKS] = {
42 root 1.11 # define def(uc, lc, name, plus, change) # change,
43     # include "attackinc.h"
44     # undef def
45 root 1.7 };
46    
47     int resist_table[NROFATTACKS] = {
48 root 1.11 # define def(uc, lc, name, plus, change) ATNR_ ## uc,
49     # include "attackinc.h"
50     # undef def
51 root 1.7 };
52    
53 elmex 1.1 /* You unforunately need to looking in include/global.h to see what these
54     * correspond to.
55     */
56     struct Settings settings = {
57 root 1.10 LOGFILE, /* Logfile */
58     CSPORT, /* Client/server port */
59 elmex 1.1
60     /* Debug level */
61     #ifdef DEBUG
62     llevDebug,
63     #else
64     llevInfo,
65     #endif
66    
67 root 1.10 0, NULL, 0, /* dumpvalues, dumparg, daemonmode */
68     0, /* argc */
69     NULL, /* argv */
70     CONFDIR,
71     DATADIR,
72     LOCALDIR,
73     PLAYERDIR, MAPDIR, ARCHETYPES, REGIONS, TREASURES,
74     UNIQUE_DIR, TEMPLATE_DIR,
75     TMPDIR,
76     STAT_LOSS_ON_DEATH,
77     PK_LUCK_PENALTY,
78     PERMANENT_EXPERIENCE_RATIO,
79     DEATH_PENALTY_RATIO,
80     DEATH_PENALTY_LEVEL,
81     BALANCED_STAT_LOSS,
82     NOT_PERMADETH,
83     SIMPLE_EXP,
84     RESET_LOCATION_TIME,
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_environ ();
152     init_globals ();
153     init_vars ();
154     init_block ();
155     ReadBmapNames ();
156     ReadSmooth ();
157     init_anim (); /* Must be after we read in the bitmaps */
158     init_archetypes (); /* Reads all archetypes from file */
159     init_dynamic ();
160     init_attackmess ();
161     init_clocks ();
162     init_experience ();
163 elmex 1.1 }
164    
165    
166     /* init_environ initializes values from the environmental variables.
167     * it needs to be called very early, since command line options should
168     * overwrite these if specified.
169     */
170 root 1.10 void
171     init_environ (void)
172     {
173     char *cp;
174 elmex 1.1
175 root 1.10 cp = getenv ("CROSSFIRE_LIBDIR");
176     if (cp)
177     settings.datadir = cp;
178     cp = getenv ("CROSSFIRE_LOCALDIR");
179     if (cp)
180     settings.localdir = cp;
181     cp = getenv ("CROSSFIRE_PLAYERDIR");
182     if (cp)
183     settings.playerdir = cp;
184     cp = getenv ("CROSSFIRE_MAPDIR");
185     if (cp)
186     settings.mapdir = cp;
187     cp = getenv ("CROSSFIRE_ARCHETYPES");
188     if (cp)
189     settings.archetypes = cp;
190     cp = getenv ("CROSSFIRE_TREASURES");
191     if (cp)
192     settings.treasures = cp;
193     cp = getenv ("CROSSFIRE_UNIQUEDIR");
194     if (cp)
195     settings.uniquedir = cp;
196     cp = getenv ("CROSSFIRE_TEMPLATEDIR");
197     if (cp)
198     settings.templatedir = cp;
199     cp = getenv ("CROSSFIRE_TMPDIR");
200     if (cp)
201     settings.tmpdir = cp;
202 elmex 1.1 }
203 root 1.10
204 elmex 1.1
205     /*
206     * Initialises all global variables.
207     * Might use environment-variables as default for some of them.
208     */
209    
210 root 1.10 void
211     init_globals (void)
212     {
213     if (settings.logfilename[0] == 0)
214 root 1.12 logfile = stderr;
215 root 1.10 else if ((logfile = fopen (settings.logfilename, "a")) == NULL)
216     {
217     fprintf (stderr, "Unable to open %s as the logfile - will use stderr instead\n", settings.logfilename);
218     logfile = stderr;
219 elmex 1.1 }
220 root 1.10 else
221 root 1.12 setvbuf (logfile, NULL, _IOLBF, 0);
222 elmex 1.1 }
223    
224 root 1.10 void
225     init_dynamic (void)
226     {
227     archetype *at = first_archetype;
228    
229     while (at)
230     {
231     if (at->clone.type == MAP)
232     {
233     if (at->clone.race)
234 root 1.19 first_map_ext_path = at->clone.race;
235 root 1.12
236 root 1.10 if (EXIT_PATH (&at->clone))
237     {
238 root 1.19 first_map_path = EXIT_PATH (&at->clone);
239 root 1.10 return;
240 elmex 1.1 }
241 root 1.2 }
242 root 1.12
243 root 1.10 at = at->next;
244 elmex 1.1 }
245 root 1.12
246 root 1.10 LOG (llevDebug, "You Need a archetype called 'map' and it have to contain start map\n");
247     exit (-1);
248 elmex 1.1 }
249    
250     unsigned long todtick;
251    
252     /*
253     * Write out the current time to the file so time does not
254     * reset every time the server reboots.
255     */
256    
257 root 1.10 void
258     write_todclock (void)
259 elmex 1.1 {
260 root 1.10 char filename[MAX_BUF];
261     FILE *fp;
262 elmex 1.1
263 root 1.10 sprintf (filename, "%s/clockdata", settings.localdir);
264     if ((fp = fopen (filename, "w")) == NULL)
265     {
266     LOG (llevError, "Cannot open %s for writing\n", filename);
267     return;
268 elmex 1.1 }
269 root 1.10 fprintf (fp, "%lu", todtick);
270     fclose (fp);
271 elmex 1.1 }
272    
273     /*
274     * Initializes the gametime and TOD counters
275     * Called by init_library().
276     */
277    
278 root 1.10 void
279     init_clocks (void)
280 elmex 1.1 {
281 root 1.10 char filename[MAX_BUF];
282     FILE *fp;
283     static int has_been_done = 0;
284    
285     if (has_been_done)
286     return;
287     else
288     has_been_done = 1;
289    
290     sprintf (filename, "%s/clockdata", settings.localdir);
291     LOG (llevDebug, "Reading clockdata from %s...", filename);
292     if ((fp = fopen (filename, "r")) == NULL)
293     {
294     LOG (llevError, "Can't open %s.\n", filename);
295     todtick = 0;
296     write_todclock ();
297     return;
298 elmex 1.1 }
299 root 1.10 fscanf (fp, "%lu", &todtick);
300     LOG (llevDebug, "todtick=%lu\n", todtick);
301     fclose (fp);
302 elmex 1.1 }
303    
304     /*
305     * Initializes the attack messages.
306     * Called by init_library().
307     */
308    
309     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
310    
311 root 1.10 void
312     init_attackmess (void)
313     {
314     char buf[MAX_BUF];
315     char filename[MAX_BUF];
316     char *cp, *p;
317     FILE *fp;
318     static int has_been_done = 0;
319     int mess, level, comp;
320     int mode = 0, total = 0;
321    
322     if (has_been_done)
323     return;
324     else
325     has_been_done = 1;
326    
327     sprintf (filename, "%s/attackmess", settings.datadir);
328     LOG (llevDebug, "Reading attack messages from %s...", filename);
329     if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
330     {
331     LOG (llevError, "Can't open %s.\n", filename);
332     return;
333 elmex 1.1 }
334    
335 root 1.10 level = 0;
336     while (fgets (buf, MAX_BUF, fp) != NULL)
337     {
338     if (*buf == '#')
339     continue;
340     if ((cp = strchr (buf, '\n')) != NULL)
341     *cp = '\0';
342     cp = buf;
343     while (*cp == ' ') /* Skip blanks */
344     cp++;
345    
346     if (strncmp (cp, "TYPE:", 5) == 0)
347     {
348     p = strtok (buf, ":");
349     p = strtok (NULL, ":");
350     if (mode == 1)
351     {
352     attack_mess[mess][level].level = -1;
353     attack_mess[mess][level].buf1 = NULL;
354     attack_mess[mess][level].buf2 = NULL;
355     attack_mess[mess][level].buf3 = NULL;
356 root 1.2 }
357 root 1.10 level = 0;
358     mess = atoi (p);
359     mode = 1;
360     continue;
361     }
362     if (mode == 1)
363     {
364     p = strtok (buf, "=");
365     attack_mess[mess][level].level = atoi (buf);
366     p = strtok (NULL, "=");
367     if (p != NULL)
368 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
369 root 1.10 else
370 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
371 root 1.10 mode = 2;
372     continue;
373     }
374     else if (mode == 2)
375     {
376     p = strtok (buf, "=");
377     attack_mess[mess][level].level = atoi (buf);
378     p = strtok (NULL, "=");
379     if (p != NULL)
380 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
381 root 1.10 else
382 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
383 root 1.10 mode = 3;
384     continue;
385 root 1.2 }
386 root 1.10 else if (mode == 3)
387     {
388     p = strtok (buf, "=");
389     attack_mess[mess][level].level = atoi (buf);
390     p = strtok (NULL, "=");
391     if (p != NULL)
392 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
393 root 1.10 else
394 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
395 root 1.10 mode = 1;
396     level++;
397     total++;
398     continue;
399 root 1.2 }
400 elmex 1.1 }
401 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
402     close_and_delete (fp, comp);
403 elmex 1.1 }