ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.29
Committed: Wed Mar 14 00:04:58 2007 UTC (17 years, 2 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.28: +0 -1 lines
Log Message:
- rewrote smooth face handling, as a side-effect, smoothing seems to work
  again and smooth faces can be reloaded.
- the server now sends the full animation for an object the first time
  it is seen, this uses slightly more bandwidth initially, but avoids
  the flickering for objects change their face later.

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