ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.28
Committed: Sun Mar 11 02:12:44 2007 UTC (17 years, 2 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.27: +0 -1 lines
Log Message:
- MAJOR CHANGE
- you now need to use cfutil to install arches.
- former bigfaces are broken in the server
- bigfaces are no longer supported. at all.
- use face numbers instead of pointers
  * saves lotsa space
  * saves lotsa indirections
  * saves lots(?) cpu cycles
- completely rewrote face handling
- faces can now be added at runtime
- reload will add new faces
- this does not apply to animations
- use a hastable instead of binary search (faster) for faces
- face caching is broken
- facesets are gone
- server always reports MAX_FACES to any client who asks

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 ReadSmooth ();
154 init_anim (); /* Must be after we read in the bitmaps */
155 init_archetypes (); /* Reads all archetypes from file */
156 init_dynamic ();
157 init_attackmess ();
158 init_clocks ();
159 init_experience ();
160 }
161
162
163 /* init_environ initialises values from the environmental variables.
164 * it needs to be called very early, since command line options should
165 * overwrite these if specified.
166 */
167 void
168 init_environ (void)
169 {
170 char *cp;
171
172 cp = getenv ("CROSSFIRE_LIBDIR");
173 if (cp)
174 settings.datadir = cp;
175 cp = getenv ("CROSSFIRE_LOCALDIR");
176 if (cp)
177 settings.localdir = cp;
178 cp = getenv ("CROSSFIRE_PLAYERDIR");
179 if (cp)
180 settings.playerdir = cp;
181 cp = getenv ("CROSSFIRE_MAPDIR");
182 if (cp)
183 settings.mapdir = cp;
184 cp = getenv ("CROSSFIRE_ARCHETYPES");
185 if (cp)
186 settings.archetypes = cp;
187 cp = getenv ("CROSSFIRE_TREASURES");
188 if (cp)
189 settings.treasures = cp;
190 cp = getenv ("CROSSFIRE_UNIQUEDIR");
191 if (cp)
192 settings.uniquedir = cp;
193 cp = getenv ("CROSSFIRE_TEMPLATEDIR");
194 if (cp)
195 settings.templatedir = cp;
196 cp = getenv ("CROSSFIRE_TMPDIR");
197 if (cp)
198 settings.tmpdir = cp;
199 }
200
201 /*
202 * Initialises all global variables.
203 * Might use environment-variables as default for some of them.
204 */
205 void
206 init_globals (void)
207 {
208 if (settings.logfilename[0] == 0)
209 logfile = stderr;
210 else if ((logfile = fopen (settings.logfilename, "a")) == NULL)
211 {
212 fprintf (stderr, "Unable to open %s as the logfile - will use stderr instead\n", settings.logfilename);
213 logfile = stderr;
214 }
215 else
216 setvbuf (logfile, NULL, _IOLBF, 0);
217 }
218
219 void
220 init_dynamic (void)
221 {
222 archetype *at = first_archetype;
223
224 while (at)
225 {
226 if (at->clone.type == MAP)
227 {
228 if (at->clone.race)
229 first_map_ext_path = at->clone.race;
230
231 if (EXIT_PATH (&at->clone))
232 {
233 first_map_path = EXIT_PATH (&at->clone);
234 return;
235 }
236 }
237
238 at = at->next;
239 }
240
241 LOG (llevDebug, "You Need a archetype called 'map' and it have to contain start map\n");
242 exit (-1);
243 }
244
245 unsigned long todtick;
246
247 /*
248 * Write out the current time to the file so time does not
249 * reset every time the server reboots.
250 */
251 void
252 write_todclock (void)
253 {
254 char filename[MAX_BUF];
255 FILE *fp;
256
257 sprintf (filename, "%s/clockdata", settings.localdir);
258 if ((fp = fopen (filename, "w")) == NULL)
259 {
260 LOG (llevError, "Cannot open %s for writing\n", filename);
261 return;
262 }
263 fprintf (fp, "%lu", todtick);
264 fclose (fp);
265 }
266
267 /*
268 * initialises the gametime and TOD counters
269 * Called by init_library().
270 */
271 void
272 init_clocks (void)
273 {
274 char filename[MAX_BUF];
275 FILE *fp;
276 static int has_been_done = 0;
277
278 if (has_been_done)
279 return;
280 else
281 has_been_done = 1;
282
283 sprintf (filename, "%s/clockdata", settings.localdir);
284 LOG (llevDebug, "Reading clockdata from %s...\n", filename);
285 if ((fp = fopen (filename, "r")) == NULL)
286 {
287 LOG (llevError, "Can't open %s.\n", filename);
288 todtick = 0;
289 write_todclock ();
290 return;
291 }
292
293 fscanf (fp, "%lu", &todtick);
294 LOG (llevDebug, "todtick=%lu\n", todtick);
295 fclose (fp);
296 }
297
298 /*
299 * initialises the attack messages.
300 * Called by init_library().
301 */
302
303 //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
304
305 void
306 init_attackmess (void)
307 {
308 char buf[MAX_BUF];
309 char filename[MAX_BUF];
310 char *cp, *p;
311 FILE *fp;
312 static int has_been_done = 0;
313 int mess, level, comp;
314 int mode = 0, total = 0;
315
316 if (has_been_done)
317 return;
318 else
319 has_been_done = 1;
320
321 sprintf (filename, "%s/attackmess", settings.datadir);
322 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
323 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
324 {
325 LOG (llevError, "Can't open %s.\n", filename);
326 return;
327 }
328
329 level = 0;
330 while (fgets (buf, MAX_BUF, fp) != NULL)
331 {
332 if (*buf == '#')
333 continue;
334 if ((cp = strchr (buf, '\n')) != NULL)
335 *cp = '\0';
336 cp = buf;
337 while (*cp == ' ') /* Skip blanks */
338 cp++;
339
340 if (strncmp (cp, "TYPE:", 5) == 0)
341 {
342 p = strtok (buf, ":");
343 p = strtok (NULL, ":");
344 if (mode == 1)
345 {
346 attack_mess[mess][level].level = -1;
347 attack_mess[mess][level].buf1 = NULL;
348 attack_mess[mess][level].buf2 = NULL;
349 attack_mess[mess][level].buf3 = NULL;
350 }
351 level = 0;
352 mess = atoi (p);
353 mode = 1;
354 continue;
355 }
356 if (mode == 1)
357 {
358 p = strtok (buf, "=");
359 attack_mess[mess][level].level = atoi (buf);
360 p = strtok (NULL, "=");
361 if (p != NULL)
362 attack_mess[mess][level].buf1 = strdup (p);
363 else
364 attack_mess[mess][level].buf1 = strdup ("");
365 mode = 2;
366 continue;
367 }
368 else if (mode == 2)
369 {
370 p = strtok (buf, "=");
371 attack_mess[mess][level].level = atoi (buf);
372 p = strtok (NULL, "=");
373 if (p != NULL)
374 attack_mess[mess][level].buf2 = strdup (p);
375 else
376 attack_mess[mess][level].buf2 = strdup ("");
377 mode = 3;
378 continue;
379 }
380 else if (mode == 3)
381 {
382 p = strtok (buf, "=");
383 attack_mess[mess][level].level = atoi (buf);
384 p = strtok (NULL, "=");
385 if (p != NULL)
386 attack_mess[mess][level].buf3 = strdup (p);
387 else
388 attack_mess[mess][level].buf3 = strdup ("");
389 mode = 1;
390 level++;
391 total++;
392 continue;
393 }
394 }
395 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
396 close_and_delete (fp, comp);
397 }