ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.33
Committed: Mon Apr 16 11:09:30 2007 UTC (17 years, 1 month ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.32: +8 -2 lines
Log Message:
load archetypes and treasures from perl, make terasures reloadable

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 init_dynamic ();
154 init_attackmess ();
155 init_experience ();
156 }
157
158 /* init_environ initialises values from the environmental variables.
159 * it needs to be called very early, since command line options should
160 * overwrite these if specified.
161 */
162 void
163 init_environ (void)
164 {
165 char *cp;
166
167 cp = getenv ("CROSSFIRE_LIBDIR");
168 if (cp)
169 settings.datadir = cp;
170
171 cp = getenv ("CROSSFIRE_LOCALDIR");
172 if (cp)
173 settings.localdir = cp;
174
175 cp = getenv ("CROSSFIRE_PLAYERDIR");
176 if (cp)
177 settings.playerdir = cp;
178
179 cp = getenv ("CROSSFIRE_MAPDIR");
180 if (cp)
181 settings.mapdir = cp;
182
183 cp = getenv ("CROSSFIRE_ARCHETYPES");
184 if (cp)
185 settings.archetypes = cp;
186
187 cp = getenv ("CROSSFIRE_TREASURES");
188 if (cp)
189 settings.treasures = cp;
190
191 cp = getenv ("CROSSFIRE_UNIQUEDIR");
192 if (cp)
193 settings.uniquedir = cp;
194
195 cp = getenv ("CROSSFIRE_TEMPLATEDIR");
196 if (cp)
197 settings.templatedir = cp;
198
199 cp = getenv ("CROSSFIRE_TMPDIR");
200 if (cp)
201 settings.tmpdir = cp;
202 }
203
204 /*
205 * Initialises all global variables.
206 * Might use environment-variables as default for some of them.
207 */
208 void
209 init_globals (void)
210 {
211 if (settings.logfilename[0] == 0)
212 logfile = stderr;
213 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 }
218 else
219 setvbuf (logfile, NULL, _IOLBF, 0);
220 }
221
222 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 first_map_ext_path = at->clone.race;
233
234 if (EXIT_PATH (&at->clone))
235 {
236 first_map_path = EXIT_PATH (&at->clone);
237 return;
238 }
239 }
240
241 at = at->next;
242 }
243
244 LOG (llevDebug, "You need an archetype of type 'map' and it has to contain the player start map\n");
245 exit (-1);
246 }
247
248 /*
249 * initialises the attack messages.
250 * Called by init_library().
251 */
252
253 //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
254
255 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 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
273 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
274 {
275 LOG (llevError, "Can't open %s.\n", filename);
276 return;
277 }
278
279 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 }
301 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 attack_mess[mess][level].buf1 = strdup (p);
313 else
314 attack_mess[mess][level].buf1 = strdup ("");
315 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 attack_mess[mess][level].buf2 = strdup (p);
325 else
326 attack_mess[mess][level].buf2 = strdup ("");
327 mode = 3;
328 continue;
329 }
330 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 attack_mess[mess][level].buf3 = strdup (p);
337 else
338 attack_mess[mess][level].buf3 = strdup ("");
339 mode = 1;
340 level++;
341 total++;
342 continue;
343 }
344 }
345 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
346 close_and_delete (fp, comp);
347 }