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

# Content
1 /*
2 * 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
25 #define EXTERN // horrible hack
26
27 #include <global.h>
28 #include <object.h>
29
30 extern const char *const attacktype_desc[NROFATTACKS] = {
31 # define def(uc, lc, name, plus, change) # name,
32 # include "attackinc.h"
33 # undef def
34 };
35
36 extern const char *const resist_plus[NROFATTACKS] = {
37 # define def(uc, lc, name, plus, change) # plus,
38 # include "attackinc.h"
39 # undef def
40 };
41
42 extern const char *const change_resist_msg[NROFATTACKS] = {
43 # define def(uc, lc, name, plus, change) # change,
44 # include "attackinc.h"
45 # undef def
46 };
47
48 int resist_table[NROFATTACKS] = {
49 # define def(uc, lc, name, plus, change) ATNR_ ## uc,
50 # include "attackinc.h"
51 # undef def
52 };
53
54 /* You unforunately need to looking in include/global.h to see what these
55 * correspond to.
56 */
57 struct Settings settings = {
58 LOGFILE, /* Logfile */
59 CSPORT, /* Client/server port */
60
61 /* Debug level */
62 #ifdef DEBUG
63 llevDebug,
64 #else
65 llevInfo,
66 #endif
67
68 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 /* Armor enchantment stuff */
105 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 };
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 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 };
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 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 }
165
166
167 /* init_environ initialises values from the environmental variables.
168 * it needs to be called very early, since command line options should
169 * overwrite these if specified.
170 */
171 void
172 init_environ (void)
173 {
174 char *cp;
175
176 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 }
204
205
206 /*
207 * Initialises all global variables.
208 * Might use environment-variables as default for some of them.
209 */
210
211 void
212 init_globals (void)
213 {
214 if (settings.logfilename[0] == 0)
215 logfile = stderr;
216 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 }
221 else
222 setvbuf (logfile, NULL, _IOLBF, 0);
223 }
224
225 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 first_map_ext_path = at->clone.race;
236
237 if (EXIT_PATH (&at->clone))
238 {
239 first_map_path = EXIT_PATH (&at->clone);
240 return;
241 }
242 }
243
244 at = at->next;
245 }
246
247 LOG (llevDebug, "You Need a archetype called 'map' and it have to contain start map\n");
248 exit (-1);
249 }
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 void
259 write_todclock (void)
260 {
261 char filename[MAX_BUF];
262 FILE *fp;
263
264 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 }
270 fprintf (fp, "%lu", todtick);
271 fclose (fp);
272 }
273
274 /*
275 * initialises the gametime and TOD counters
276 * Called by init_library().
277 */
278
279 void
280 init_clocks (void)
281 {
282 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 LOG (llevDebug, "Reading clockdata from %s...\n", filename);
293 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 }
300 fscanf (fp, "%lu", &todtick);
301 LOG (llevDebug, "todtick=%lu\n", todtick);
302 fclose (fp);
303 }
304
305 /*
306 * initialises the attack messages.
307 * Called by init_library().
308 */
309
310 //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
311
312 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 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
330 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
331 {
332 LOG (llevError, "Can't open %s.\n", filename);
333 return;
334 }
335
336 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 }
358 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 attack_mess[mess][level].buf1 = strdup (p);
370 else
371 attack_mess[mess][level].buf1 = strdup ("");
372 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 attack_mess[mess][level].buf2 = strdup (p);
382 else
383 attack_mess[mess][level].buf2 = strdup ("");
384 mode = 3;
385 continue;
386 }
387 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 attack_mess[mess][level].buf3 = strdup (p);
394 else
395 attack_mess[mess][level].buf3 = strdup ("");
396 mode = 1;
397 level++;
398 total++;
399 continue;
400 }
401 }
402 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
403 close_and_delete (fp, comp);
404 }