ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.36
Committed: Mon May 28 21:21:40 2007 UTC (17 years ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.35: +17 -17 lines
Log Message:
update copyrights in common/*.C and util/*.C

File Contents

# Content
1 /*
2 * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game.
3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 *
8 * Crossfire TRT is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the Free
10 * Software Foundation; either version 2 of the License, or (at your option)
11 * any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 * for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51
20 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 *
22 * The authors can be reached via e-mail to <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 PK_LUCK_PENALTY,
78 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 SET_FRIENDLY_FIRE,
91 0,
92 0,
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 /* Armor enchantment stuff */
104 ARMOR_MAX_ENCHANT,
105 ARMOR_WEIGHT_REDUCTION,
106 ARMOR_WEIGHT_LINEAR,
107 ARMOR_SPEED_IMPROVEMENT,
108 ARMOR_SPEED_LINEAR,
109 };
110
111 /* perhaps not the best place for this, but needs to be
112 * in some file in the common area so that standalone
113 * programs, like the random map generator, can be built.
114 */
115 const char *const spellpathnames[NRSPELLPATHS] = {
116 "Protection",
117 "Fire",
118 "Frost",
119 "Electricity",
120 "Missiles",
121 "Self",
122 "Summoning",
123 "Abjuration",
124 "Restoration",
125 "Detonation",
126 "Mind",
127 "Creation",
128 "Teleportation",
129 "Information",
130 "Transmutation",
131 "Transferrence",
132 "Turning",
133 "Wounding",
134 "Death",
135 "Light"
136 };
137
138 /*
139 * It is vital that init_library() is called by any functions
140 * using this library.
141 * If you want to lessen the size of the program using the library,
142 * you can replace the call to init_library() with init_globals() and
143 * init_function_pointers(). Good idea to also call init_vars and
144 * init_hash_table if you are doing any object loading.
145 */
146 void
147 init_library (void)
148 {
149 init_globals ();
150 init_block ();
151 init_dynamic ();
152 init_attackmess ();
153 init_experience ();
154 }
155
156 /* init_environ initialises values from the environmental variables.
157 * it needs to be called very early, since command line options should
158 * overwrite these if specified.
159 */
160 void
161 init_environ (void)
162 {
163 char *cp;
164
165 cp = getenv ("CROSSFIRE_LIBDIR");
166 if (cp)
167 settings.datadir = cp;
168
169 cp = getenv ("CROSSFIRE_LOCALDIR");
170 if (cp)
171 settings.localdir = cp;
172
173 cp = getenv ("CROSSFIRE_PLAYERDIR");
174 if (cp)
175 settings.playerdir = cp;
176
177 cp = getenv ("CROSSFIRE_MAPDIR");
178 if (cp)
179 settings.mapdir = cp;
180
181 cp = getenv ("CROSSFIRE_ARCHETYPES");
182 if (cp)
183 settings.archetypes = cp;
184
185 cp = getenv ("CROSSFIRE_TREASURES");
186 if (cp)
187 settings.treasures = cp;
188
189 cp = getenv ("CROSSFIRE_UNIQUEDIR");
190 if (cp)
191 settings.uniquedir = cp;
192
193 cp = getenv ("CROSSFIRE_TEMPLATEDIR");
194 if (cp)
195 settings.templatedir = cp;
196
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 an archetype of type 'map' and it has to contain the player start map\n");
243 exit (-1);
244 }
245
246 /*
247 * initialises the attack messages.
248 * Called by init_library().
249 */
250
251 //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
252
253 void
254 init_attackmess (void)
255 {
256 char buf[MAX_BUF];
257 char filename[MAX_BUF];
258 char *cp, *p;
259 FILE *fp;
260 static int has_been_done = 0;
261 int mess, level, comp;
262 int mode = 0, total = 0;
263
264 if (has_been_done)
265 return;
266 else
267 has_been_done = 1;
268
269 sprintf (filename, "%s/attackmess", settings.datadir);
270 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
271 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
272 {
273 LOG (llevError, "Can't open %s.\n", filename);
274 return;
275 }
276
277 level = 0;
278 while (fgets (buf, MAX_BUF, fp) != NULL)
279 {
280 if (*buf == '#')
281 continue;
282 if ((cp = strchr (buf, '\n')) != NULL)
283 *cp = '\0';
284 cp = buf;
285 while (*cp == ' ') /* Skip blanks */
286 cp++;
287
288 if (strncmp (cp, "TYPE:", 5) == 0)
289 {
290 p = strtok (buf, ":");
291 p = strtok (NULL, ":");
292 if (mode == 1)
293 {
294 attack_mess[mess][level].level = -1;
295 attack_mess[mess][level].buf1 = NULL;
296 attack_mess[mess][level].buf2 = NULL;
297 attack_mess[mess][level].buf3 = NULL;
298 }
299 level = 0;
300 mess = atoi (p);
301 mode = 1;
302 continue;
303 }
304 if (mode == 1)
305 {
306 p = strtok (buf, "=");
307 attack_mess[mess][level].level = atoi (buf);
308 p = strtok (NULL, "=");
309 if (p != NULL)
310 attack_mess[mess][level].buf1 = strdup (p);
311 else
312 attack_mess[mess][level].buf1 = strdup ("");
313 mode = 2;
314 continue;
315 }
316 else if (mode == 2)
317 {
318 p = strtok (buf, "=");
319 attack_mess[mess][level].level = atoi (buf);
320 p = strtok (NULL, "=");
321 if (p != NULL)
322 attack_mess[mess][level].buf2 = strdup (p);
323 else
324 attack_mess[mess][level].buf2 = strdup ("");
325 mode = 3;
326 continue;
327 }
328 else if (mode == 3)
329 {
330 p = strtok (buf, "=");
331 attack_mess[mess][level].level = atoi (buf);
332 p = strtok (NULL, "=");
333 if (p != NULL)
334 attack_mess[mess][level].buf3 = strdup (p);
335 else
336 attack_mess[mess][level].buf3 = strdup ("");
337 mode = 1;
338 level++;
339 total++;
340 continue;
341 }
342 }
343 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
344 close_and_delete (fp, comp);
345 }