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

# 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 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 /* Armor enchantment stuff */
104 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 };
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 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 };
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 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 }
162
163
164 /* init_environ initialises values from the environmental variables.
165 * it needs to be called very early, since command line options should
166 * overwrite these if specified.
167 */
168 void
169 init_environ (void)
170 {
171 char *cp;
172
173 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 }
201
202 /*
203 * Initialises all global variables.
204 * Might use environment-variables as default for some of them.
205 */
206 void
207 init_globals (void)
208 {
209 if (settings.logfilename[0] == 0)
210 logfile = stderr;
211 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 }
216 else
217 setvbuf (logfile, NULL, _IOLBF, 0);
218 }
219
220 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 first_map_ext_path = at->clone.race;
231
232 if (EXIT_PATH (&at->clone))
233 {
234 first_map_path = EXIT_PATH (&at->clone);
235 return;
236 }
237 }
238
239 at = at->next;
240 }
241
242 LOG (llevDebug, "You Need a archetype called 'map' and it have to contain start map\n");
243 exit (-1);
244 }
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 void
253 write_todclock (void)
254 {
255 char filename[MAX_BUF];
256 FILE *fp;
257
258 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 }
264 fprintf (fp, "%lu", todtick);
265 fclose (fp);
266 }
267
268 /*
269 * initialises the gametime and TOD counters
270 * Called by init_library().
271 */
272 void
273 init_clocks (void)
274 {
275 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 LOG (llevDebug, "Reading clockdata from %s...\n", filename);
286 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 }
293
294 fscanf (fp, "%lu", &todtick);
295 LOG (llevDebug, "todtick=%lu\n", todtick);
296 fclose (fp);
297 }
298
299 /*
300 * initialises the attack messages.
301 * Called by init_library().
302 */
303
304 //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
305
306 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 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
324 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
325 {
326 LOG (llevError, "Can't open %s.\n", filename);
327 return;
328 }
329
330 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 }
352 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 attack_mess[mess][level].buf1 = strdup (p);
364 else
365 attack_mess[mess][level].buf1 = strdup ("");
366 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 attack_mess[mess][level].buf2 = strdup (p);
376 else
377 attack_mess[mess][level].buf2 = strdup ("");
378 mode = 3;
379 continue;
380 }
381 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 attack_mess[mess][level].buf3 = strdup (p);
388 else
389 attack_mess[mess][level].buf3 = strdup ("");
390 mode = 1;
391 level++;
392 total++;
393 continue;
394 }
395 }
396 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
397 close_and_delete (fp, comp);
398 }