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

# User Rev Content
1 elmex 1.1 /*
2 pippijn 1.23 * 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 elmex 1.1
25 root 1.10 #define EXTERN // horrible hack
26 root 1.7
27 elmex 1.1 #include <global.h>
28     #include <object.h>
29    
30 root 1.10 extern const char *const attacktype_desc[NROFATTACKS] = {
31 root 1.11 # define def(uc, lc, name, plus, change) # name,
32     # include "attackinc.h"
33     # undef def
34 root 1.7 };
35    
36 root 1.10 extern const char *const resist_plus[NROFATTACKS] = {
37 root 1.11 # define def(uc, lc, name, plus, change) # plus,
38     # include "attackinc.h"
39     # undef def
40 root 1.7 };
41    
42 root 1.10 extern const char *const change_resist_msg[NROFATTACKS] = {
43 root 1.11 # define def(uc, lc, name, plus, change) # change,
44     # include "attackinc.h"
45     # undef def
46 root 1.7 };
47    
48     int resist_table[NROFATTACKS] = {
49 root 1.11 # define def(uc, lc, name, plus, change) ATNR_ ## uc,
50     # include "attackinc.h"
51     # undef def
52 root 1.7 };
53    
54 elmex 1.1 /* You unforunately need to looking in include/global.h to see what these
55     * correspond to.
56     */
57     struct Settings settings = {
58 root 1.10 LOGFILE, /* Logfile */
59     CSPORT, /* Client/server port */
60 elmex 1.1
61     /* Debug level */
62     #ifdef DEBUG
63     llevDebug,
64     #else
65     llevInfo,
66     #endif
67    
68 root 1.10 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 elmex 1.1 /* Armor enchantment stuff */
104 root 1.10 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 elmex 1.1 };
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 root 1.10 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 elmex 1.1 };
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 root 1.10 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 elmex 1.1 }
160    
161    
162 pippijn 1.21 /* init_environ initialises values from the environmental variables.
163 elmex 1.1 * it needs to be called very early, since command line options should
164     * overwrite these if specified.
165     */
166 root 1.10 void
167     init_environ (void)
168     {
169     char *cp;
170 elmex 1.1
171 root 1.10 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 elmex 1.1 }
199 root 1.10
200 elmex 1.1 /*
201     * Initialises all global variables.
202     * Might use environment-variables as default for some of them.
203     */
204 root 1.10 void
205     init_globals (void)
206     {
207     if (settings.logfilename[0] == 0)
208 root 1.12 logfile = stderr;
209 root 1.10 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 elmex 1.1 }
214 root 1.10 else
215 root 1.12 setvbuf (logfile, NULL, _IOLBF, 0);
216 elmex 1.1 }
217    
218 root 1.10 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 root 1.19 first_map_ext_path = at->clone.race;
229 root 1.12
230 root 1.10 if (EXIT_PATH (&at->clone))
231     {
232 root 1.19 first_map_path = EXIT_PATH (&at->clone);
233 root 1.10 return;
234 elmex 1.1 }
235 root 1.2 }
236 root 1.12
237 root 1.10 at = at->next;
238 elmex 1.1 }
239 root 1.12
240 root 1.10 LOG (llevDebug, "You Need a archetype called 'map' and it have to contain start map\n");
241     exit (-1);
242 elmex 1.1 }
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 root 1.10 void
251     write_todclock (void)
252 elmex 1.1 {
253 root 1.10 char filename[MAX_BUF];
254     FILE *fp;
255 elmex 1.1
256 root 1.10 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 elmex 1.1 }
262 root 1.10 fprintf (fp, "%lu", todtick);
263     fclose (fp);
264 elmex 1.1 }
265    
266     /*
267 pippijn 1.21 * initialises the gametime and TOD counters
268 elmex 1.1 * Called by init_library().
269     */
270 root 1.10 void
271     init_clocks (void)
272 elmex 1.1 {
273 root 1.10 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 pippijn 1.20 LOG (llevDebug, "Reading clockdata from %s...\n", filename);
284 root 1.10 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 elmex 1.1 }
291 root 1.26
292 root 1.10 fscanf (fp, "%lu", &todtick);
293     LOG (llevDebug, "todtick=%lu\n", todtick);
294     fclose (fp);
295 elmex 1.1 }
296    
297     /*
298 pippijn 1.21 * initialises the attack messages.
299 elmex 1.1 * Called by init_library().
300     */
301    
302     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
303    
304 root 1.10 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 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
322 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
323     {
324     LOG (llevError, "Can't open %s.\n", filename);
325     return;
326 elmex 1.1 }
327    
328 root 1.10 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 root 1.2 }
350 root 1.10 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 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
362 root 1.10 else
363 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
364 root 1.10 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 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
374 root 1.10 else
375 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
376 root 1.10 mode = 3;
377     continue;
378 root 1.2 }
379 root 1.10 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 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
386 root 1.10 else
387 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
388 root 1.10 mode = 1;
389     level++;
390     total++;
391     continue;
392 root 1.2 }
393 elmex 1.1 }
394 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
395     close_and_delete (fp, comp);
396 elmex 1.1 }