ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.30
Committed: Sat Mar 17 22:11:22 2007 UTC (17 years, 3 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.29: +0 -54 lines
Log Message:
remove clockdata and base it off of the runtime; improve the tod code.

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_experience ();
158 elmex 1.1 }
159    
160    
161 pippijn 1.21 /* init_environ initialises values from the environmental variables.
162 elmex 1.1 * it needs to be called very early, since command line options should
163     * overwrite these if specified.
164     */
165 root 1.10 void
166     init_environ (void)
167     {
168     char *cp;
169 elmex 1.1
170 root 1.10 cp = getenv ("CROSSFIRE_LIBDIR");
171     if (cp)
172     settings.datadir = cp;
173     cp = getenv ("CROSSFIRE_LOCALDIR");
174     if (cp)
175     settings.localdir = cp;
176     cp = getenv ("CROSSFIRE_PLAYERDIR");
177     if (cp)
178     settings.playerdir = cp;
179     cp = getenv ("CROSSFIRE_MAPDIR");
180     if (cp)
181     settings.mapdir = cp;
182     cp = getenv ("CROSSFIRE_ARCHETYPES");
183     if (cp)
184     settings.archetypes = cp;
185     cp = getenv ("CROSSFIRE_TREASURES");
186     if (cp)
187     settings.treasures = cp;
188     cp = getenv ("CROSSFIRE_UNIQUEDIR");
189     if (cp)
190     settings.uniquedir = cp;
191     cp = getenv ("CROSSFIRE_TEMPLATEDIR");
192     if (cp)
193     settings.templatedir = cp;
194     cp = getenv ("CROSSFIRE_TMPDIR");
195     if (cp)
196     settings.tmpdir = cp;
197 elmex 1.1 }
198 root 1.10
199 elmex 1.1 /*
200     * Initialises all global variables.
201     * Might use environment-variables as default for some of them.
202     */
203 root 1.10 void
204     init_globals (void)
205     {
206     if (settings.logfilename[0] == 0)
207 root 1.12 logfile = stderr;
208 root 1.10 else if ((logfile = fopen (settings.logfilename, "a")) == NULL)
209     {
210     fprintf (stderr, "Unable to open %s as the logfile - will use stderr instead\n", settings.logfilename);
211     logfile = stderr;
212 elmex 1.1 }
213 root 1.10 else
214 root 1.12 setvbuf (logfile, NULL, _IOLBF, 0);
215 elmex 1.1 }
216    
217 root 1.10 void
218     init_dynamic (void)
219     {
220     archetype *at = first_archetype;
221    
222     while (at)
223     {
224     if (at->clone.type == MAP)
225     {
226     if (at->clone.race)
227 root 1.19 first_map_ext_path = at->clone.race;
228 root 1.12
229 root 1.10 if (EXIT_PATH (&at->clone))
230     {
231 root 1.19 first_map_path = EXIT_PATH (&at->clone);
232 root 1.10 return;
233 elmex 1.1 }
234 root 1.2 }
235 root 1.12
236 root 1.10 at = at->next;
237 elmex 1.1 }
238 root 1.12
239 root 1.10 LOG (llevDebug, "You Need a archetype called 'map' and it have to contain start map\n");
240     exit (-1);
241 elmex 1.1 }
242    
243     /*
244 pippijn 1.21 * initialises the attack messages.
245 elmex 1.1 * Called by init_library().
246     */
247    
248     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
249    
250 root 1.10 void
251     init_attackmess (void)
252     {
253     char buf[MAX_BUF];
254     char filename[MAX_BUF];
255     char *cp, *p;
256     FILE *fp;
257     static int has_been_done = 0;
258     int mess, level, comp;
259     int mode = 0, total = 0;
260    
261     if (has_been_done)
262     return;
263     else
264     has_been_done = 1;
265    
266     sprintf (filename, "%s/attackmess", settings.datadir);
267 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
268 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
269     {
270     LOG (llevError, "Can't open %s.\n", filename);
271     return;
272 elmex 1.1 }
273    
274 root 1.10 level = 0;
275     while (fgets (buf, MAX_BUF, fp) != NULL)
276     {
277     if (*buf == '#')
278     continue;
279     if ((cp = strchr (buf, '\n')) != NULL)
280     *cp = '\0';
281     cp = buf;
282     while (*cp == ' ') /* Skip blanks */
283     cp++;
284    
285     if (strncmp (cp, "TYPE:", 5) == 0)
286     {
287     p = strtok (buf, ":");
288     p = strtok (NULL, ":");
289     if (mode == 1)
290     {
291     attack_mess[mess][level].level = -1;
292     attack_mess[mess][level].buf1 = NULL;
293     attack_mess[mess][level].buf2 = NULL;
294     attack_mess[mess][level].buf3 = NULL;
295 root 1.2 }
296 root 1.10 level = 0;
297     mess = atoi (p);
298     mode = 1;
299     continue;
300     }
301     if (mode == 1)
302     {
303     p = strtok (buf, "=");
304     attack_mess[mess][level].level = atoi (buf);
305     p = strtok (NULL, "=");
306     if (p != NULL)
307 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
308 root 1.10 else
309 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
310 root 1.10 mode = 2;
311     continue;
312     }
313     else if (mode == 2)
314     {
315     p = strtok (buf, "=");
316     attack_mess[mess][level].level = atoi (buf);
317     p = strtok (NULL, "=");
318     if (p != NULL)
319 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
320 root 1.10 else
321 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
322 root 1.10 mode = 3;
323     continue;
324 root 1.2 }
325 root 1.10 else if (mode == 3)
326     {
327     p = strtok (buf, "=");
328     attack_mess[mess][level].level = atoi (buf);
329     p = strtok (NULL, "=");
330     if (p != NULL)
331 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
332 root 1.10 else
333 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
334 root 1.10 mode = 1;
335     level++;
336     total++;
337     continue;
338 root 1.2 }
339 elmex 1.1 }
340 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
341     close_and_delete (fp, comp);
342 elmex 1.1 }