ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.34
Committed: Thu May 17 13:24:54 2007 UTC (17 years ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.33: +2 -2 lines
Log Message:
fix ordering in static settings initialiser that enabled catsing_time by default (leading to, of coruse, crashes). found by archaios and me

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 root 1.34 PK_LUCK_PENALTY,
78 root 1.10 STAT_LOSS_ON_DEATH,
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 root 1.34 SET_FRIENDLY_FIRE,
91 root 1.10 CASTING_TIME,
92     REAL_WIZ,
93     EXPLORE_MODE,
94     SPELLPOINT_LEVEL_DEPEND,
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     init_dynamic ();
154     init_attackmess ();
155     init_experience ();
156 elmex 1.1 }
157    
158 pippijn 1.21 /* init_environ initialises values from the environmental variables.
159 elmex 1.1 * it needs to be called very early, since command line options should
160     * overwrite these if specified.
161     */
162 root 1.10 void
163     init_environ (void)
164     {
165     char *cp;
166 elmex 1.1
167 root 1.10 cp = getenv ("CROSSFIRE_LIBDIR");
168     if (cp)
169     settings.datadir = cp;
170 root 1.33
171 root 1.10 cp = getenv ("CROSSFIRE_LOCALDIR");
172     if (cp)
173     settings.localdir = cp;
174 root 1.33
175 root 1.10 cp = getenv ("CROSSFIRE_PLAYERDIR");
176     if (cp)
177     settings.playerdir = cp;
178 root 1.33
179 root 1.10 cp = getenv ("CROSSFIRE_MAPDIR");
180     if (cp)
181     settings.mapdir = cp;
182 root 1.33
183 root 1.10 cp = getenv ("CROSSFIRE_ARCHETYPES");
184     if (cp)
185     settings.archetypes = cp;
186 root 1.33
187 root 1.10 cp = getenv ("CROSSFIRE_TREASURES");
188     if (cp)
189     settings.treasures = cp;
190 root 1.33
191 root 1.10 cp = getenv ("CROSSFIRE_UNIQUEDIR");
192     if (cp)
193     settings.uniquedir = cp;
194 root 1.33
195 root 1.10 cp = getenv ("CROSSFIRE_TEMPLATEDIR");
196     if (cp)
197     settings.templatedir = cp;
198 root 1.33
199 root 1.10 cp = getenv ("CROSSFIRE_TMPDIR");
200     if (cp)
201     settings.tmpdir = cp;
202 elmex 1.1 }
203 root 1.10
204 elmex 1.1 /*
205     * Initialises all global variables.
206     * Might use environment-variables as default for some of them.
207     */
208 root 1.10 void
209     init_globals (void)
210     {
211     if (settings.logfilename[0] == 0)
212 root 1.12 logfile = stderr;
213 root 1.10 else if ((logfile = fopen (settings.logfilename, "a")) == NULL)
214     {
215     fprintf (stderr, "Unable to open %s as the logfile - will use stderr instead\n", settings.logfilename);
216     logfile = stderr;
217 elmex 1.1 }
218 root 1.10 else
219 root 1.12 setvbuf (logfile, NULL, _IOLBF, 0);
220 elmex 1.1 }
221    
222 root 1.10 void
223     init_dynamic (void)
224     {
225     archetype *at = first_archetype;
226    
227     while (at)
228     {
229     if (at->clone.type == MAP)
230     {
231     if (at->clone.race)
232 root 1.19 first_map_ext_path = at->clone.race;
233 root 1.12
234 root 1.10 if (EXIT_PATH (&at->clone))
235     {
236 root 1.19 first_map_path = EXIT_PATH (&at->clone);
237 root 1.10 return;
238 elmex 1.1 }
239 root 1.2 }
240 root 1.12
241 root 1.10 at = at->next;
242 elmex 1.1 }
243 root 1.12
244 root 1.32 LOG (llevDebug, "You need an archetype of type 'map' and it has to contain the player start map\n");
245 root 1.10 exit (-1);
246 elmex 1.1 }
247    
248     /*
249 pippijn 1.21 * initialises the attack messages.
250 elmex 1.1 * Called by init_library().
251     */
252    
253     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
254    
255 root 1.10 void
256     init_attackmess (void)
257     {
258     char buf[MAX_BUF];
259     char filename[MAX_BUF];
260     char *cp, *p;
261     FILE *fp;
262     static int has_been_done = 0;
263     int mess, level, comp;
264     int mode = 0, total = 0;
265    
266     if (has_been_done)
267     return;
268     else
269     has_been_done = 1;
270    
271     sprintf (filename, "%s/attackmess", settings.datadir);
272 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
273 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
274     {
275     LOG (llevError, "Can't open %s.\n", filename);
276     return;
277 elmex 1.1 }
278    
279 root 1.10 level = 0;
280     while (fgets (buf, MAX_BUF, fp) != NULL)
281     {
282     if (*buf == '#')
283     continue;
284     if ((cp = strchr (buf, '\n')) != NULL)
285     *cp = '\0';
286     cp = buf;
287     while (*cp == ' ') /* Skip blanks */
288     cp++;
289    
290     if (strncmp (cp, "TYPE:", 5) == 0)
291     {
292     p = strtok (buf, ":");
293     p = strtok (NULL, ":");
294     if (mode == 1)
295     {
296     attack_mess[mess][level].level = -1;
297     attack_mess[mess][level].buf1 = NULL;
298     attack_mess[mess][level].buf2 = NULL;
299     attack_mess[mess][level].buf3 = NULL;
300 root 1.2 }
301 root 1.10 level = 0;
302     mess = atoi (p);
303     mode = 1;
304     continue;
305     }
306     if (mode == 1)
307     {
308     p = strtok (buf, "=");
309     attack_mess[mess][level].level = atoi (buf);
310     p = strtok (NULL, "=");
311     if (p != NULL)
312 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
313 root 1.10 else
314 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
315 root 1.10 mode = 2;
316     continue;
317     }
318     else if (mode == 2)
319     {
320     p = strtok (buf, "=");
321     attack_mess[mess][level].level = atoi (buf);
322     p = strtok (NULL, "=");
323     if (p != NULL)
324 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
325 root 1.10 else
326 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
327 root 1.10 mode = 3;
328     continue;
329 root 1.2 }
330 root 1.10 else if (mode == 3)
331     {
332     p = strtok (buf, "=");
333     attack_mess[mess][level].level = atoi (buf);
334     p = strtok (NULL, "=");
335     if (p != NULL)
336 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
337 root 1.10 else
338 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
339 root 1.10 mode = 1;
340     level++;
341     total++;
342     continue;
343 root 1.2 }
344 elmex 1.1 }
345 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
346     close_and_delete (fp, comp);
347 elmex 1.1 }