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, 3 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

# 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     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 elmex 1.1 }
161    
162    
163 pippijn 1.21 /* init_environ initialises values from the environmental variables.
164 elmex 1.1 * it needs to be called very early, since command line options should
165     * overwrite these if specified.
166     */
167 root 1.10 void
168     init_environ (void)
169     {
170     char *cp;
171 elmex 1.1
172 root 1.10 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 elmex 1.1 }
200 root 1.10
201 elmex 1.1 /*
202     * Initialises all global variables.
203     * Might use environment-variables as default for some of them.
204     */
205 root 1.10 void
206     init_globals (void)
207     {
208     if (settings.logfilename[0] == 0)
209 root 1.12 logfile = stderr;
210 root 1.10 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 elmex 1.1 }
215 root 1.10 else
216 root 1.12 setvbuf (logfile, NULL, _IOLBF, 0);
217 elmex 1.1 }
218    
219 root 1.10 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 root 1.19 first_map_ext_path = at->clone.race;
230 root 1.12
231 root 1.10 if (EXIT_PATH (&at->clone))
232     {
233 root 1.19 first_map_path = EXIT_PATH (&at->clone);
234 root 1.10 return;
235 elmex 1.1 }
236 root 1.2 }
237 root 1.12
238 root 1.10 at = at->next;
239 elmex 1.1 }
240 root 1.12
241 root 1.10 LOG (llevDebug, "You Need a archetype called 'map' and it have to contain start map\n");
242     exit (-1);
243 elmex 1.1 }
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 root 1.10 void
252     write_todclock (void)
253 elmex 1.1 {
254 root 1.10 char filename[MAX_BUF];
255     FILE *fp;
256 elmex 1.1
257 root 1.10 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 elmex 1.1 }
263 root 1.10 fprintf (fp, "%lu", todtick);
264     fclose (fp);
265 elmex 1.1 }
266    
267     /*
268 pippijn 1.21 * initialises the gametime and TOD counters
269 elmex 1.1 * Called by init_library().
270     */
271 root 1.10 void
272     init_clocks (void)
273 elmex 1.1 {
274 root 1.10 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 pippijn 1.20 LOG (llevDebug, "Reading clockdata from %s...\n", filename);
285 root 1.10 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 elmex 1.1 }
292 root 1.26
293 root 1.10 fscanf (fp, "%lu", &todtick);
294     LOG (llevDebug, "todtick=%lu\n", todtick);
295     fclose (fp);
296 elmex 1.1 }
297    
298     /*
299 pippijn 1.21 * initialises the attack messages.
300 elmex 1.1 * Called by init_library().
301     */
302    
303     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
304    
305 root 1.10 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 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
323 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
324     {
325     LOG (llevError, "Can't open %s.\n", filename);
326     return;
327 elmex 1.1 }
328    
329 root 1.10 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 root 1.2 }
351 root 1.10 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 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
363 root 1.10 else
364 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
365 root 1.10 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 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
375 root 1.10 else
376 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
377 root 1.10 mode = 3;
378     continue;
379 root 1.2 }
380 root 1.10 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 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
387 root 1.10 else
388 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
389 root 1.10 mode = 1;
390     level++;
391     total++;
392     continue;
393 root 1.2 }
394 elmex 1.1 }
395 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
396     close_and_delete (fp, comp);
397 elmex 1.1 }