ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.39
Committed: Mon Jul 16 09:07:12 2007 UTC (16 years, 11 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.38: +2 -17 lines
Log Message:
hardcode map start paths for now (and likely forever)

File Contents

# User Rev Content
1 elmex 1.1 /*
2 root 1.38 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3 pippijn 1.23 *
4 root 1.36 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5     * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6     * Copyright (©) 1992,2007 Frank Tore Johansen
7 pippijn 1.23 *
8 root 1.38 * Crossfire TRT 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 3 of the License, or
11     * (at your option) any later version.
12 pippijn 1.23 *
13 root 1.38 * 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 pippijn 1.23 *
18 root 1.38 * You should have received a copy of the GNU General Public License
19     * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 root 1.36 *
21     * The authors can be reached via e-mail to <crossfire@schmorp.de>
22 pippijn 1.23 */
23 elmex 1.1
24 root 1.10 #define EXTERN // horrible hack
25 root 1.7
26 elmex 1.1 #include <global.h>
27     #include <object.h>
28    
29 root 1.10 extern const char *const attacktype_desc[NROFATTACKS] = {
30 root 1.11 # define def(uc, lc, name, plus, change) # name,
31     # include "attackinc.h"
32     # undef def
33 root 1.7 };
34    
35 root 1.10 extern const char *const resist_plus[NROFATTACKS] = {
36 root 1.11 # define def(uc, lc, name, plus, change) # plus,
37     # include "attackinc.h"
38     # undef def
39 root 1.7 };
40    
41 root 1.10 extern const char *const change_resist_msg[NROFATTACKS] = {
42 root 1.11 # define def(uc, lc, name, plus, change) # change,
43     # include "attackinc.h"
44     # undef def
45 root 1.7 };
46    
47     int resist_table[NROFATTACKS] = {
48 root 1.11 # define def(uc, lc, name, plus, change) ATNR_ ## uc,
49     # include "attackinc.h"
50     # undef def
51 root 1.7 };
52    
53 elmex 1.1 /* You unforunately need to looking in include/global.h to see what these
54     * correspond to.
55     */
56     struct Settings settings = {
57 root 1.10 LOGFILE, /* Logfile */
58     CSPORT, /* Client/server port */
59 elmex 1.1
60     /* Debug level */
61     #ifdef DEBUG
62     llevDebug,
63     #else
64     llevInfo,
65     #endif
66    
67 root 1.10 0, NULL, 0, /* dumpvalues, dumparg, daemonmode */
68     0, /* argc */
69     NULL, /* argv */
70     CONFDIR,
71     DATADIR,
72     LOCALDIR,
73     PLAYERDIR, MAPDIR, ARCHETYPES, REGIONS, TREASURES,
74     UNIQUE_DIR, TEMPLATE_DIR,
75     TMPDIR,
76 root 1.34 PK_LUCK_PENALTY,
77 root 1.10 STAT_LOSS_ON_DEATH,
78     PERMANENT_EXPERIENCE_RATIO,
79     DEATH_PENALTY_RATIO,
80     DEATH_PENALTY_LEVEL,
81     BALANCED_STAT_LOSS,
82     NOT_PERMADETH,
83     SIMPLE_EXP,
84     SET_TITLE,
85     RESURRECTION,
86     SEARCH_ITEMS,
87     SPELL_ENCUMBRANCE,
88     SPELL_FAILURE_EFFECTS,
89 root 1.34 SET_FRIENDLY_FIRE,
90 root 1.35 0,
91     0,
92 root 1.10 EXPLORE_MODE,
93     SPELLPOINT_LEVEL_DEPEND,
94     MOTD,
95     "rules",
96     "news",
97     "", /* DM_MAIL */
98     0, 0, 0, 0, 0, 0, 0, 0, /* worldmap settings */
99     0,
100     1.0,
101    
102 elmex 1.1 /* Armor enchantment stuff */
103 root 1.10 ARMOR_MAX_ENCHANT,
104     ARMOR_WEIGHT_REDUCTION,
105     ARMOR_WEIGHT_LINEAR,
106     ARMOR_SPEED_IMPROVEMENT,
107     ARMOR_SPEED_LINEAR,
108 elmex 1.1 };
109    
110     /* perhaps not the best place for this, but needs to be
111     * in some file in the common area so that standalone
112     * programs, like the random map generator, can be built.
113     */
114 root 1.10 const char *const spellpathnames[NRSPELLPATHS] = {
115     "Protection",
116     "Fire",
117     "Frost",
118     "Electricity",
119     "Missiles",
120     "Self",
121     "Summoning",
122     "Abjuration",
123     "Restoration",
124     "Detonation",
125     "Mind",
126     "Creation",
127     "Teleportation",
128     "Information",
129     "Transmutation",
130     "Transferrence",
131     "Turning",
132     "Wounding",
133     "Death",
134     "Light"
135 elmex 1.1 };
136    
137     /*
138     * It is vital that init_library() is called by any functions
139     * using this library.
140     * If you want to lessen the size of the program using the library,
141     * you can replace the call to init_library() with init_globals() and
142     * init_function_pointers(). Good idea to also call init_vars and
143     * init_hash_table if you are doing any object loading.
144     */
145 root 1.10 void
146     init_library (void)
147     {
148     init_globals ();
149     init_block ();
150     init_dynamic ();
151     init_attackmess ();
152     init_experience ();
153 elmex 1.1 }
154    
155 pippijn 1.21 /* init_environ initialises values from the environmental variables.
156 elmex 1.1 * it needs to be called very early, since command line options should
157     * overwrite these if specified.
158     */
159 root 1.10 void
160     init_environ (void)
161     {
162     char *cp;
163 elmex 1.1
164 root 1.10 cp = getenv ("CROSSFIRE_LIBDIR");
165     if (cp)
166     settings.datadir = cp;
167 root 1.33
168 root 1.10 cp = getenv ("CROSSFIRE_LOCALDIR");
169     if (cp)
170     settings.localdir = cp;
171 root 1.33
172 root 1.10 cp = getenv ("CROSSFIRE_PLAYERDIR");
173     if (cp)
174     settings.playerdir = cp;
175 root 1.33
176 root 1.10 cp = getenv ("CROSSFIRE_MAPDIR");
177     if (cp)
178     settings.mapdir = cp;
179 root 1.33
180 root 1.10 cp = getenv ("CROSSFIRE_ARCHETYPES");
181     if (cp)
182     settings.archetypes = cp;
183 root 1.33
184 root 1.10 cp = getenv ("CROSSFIRE_TREASURES");
185     if (cp)
186     settings.treasures = cp;
187 root 1.33
188 root 1.10 cp = getenv ("CROSSFIRE_UNIQUEDIR");
189     if (cp)
190     settings.uniquedir = cp;
191 root 1.33
192 root 1.10 cp = getenv ("CROSSFIRE_TEMPLATEDIR");
193     if (cp)
194     settings.templatedir = cp;
195 root 1.33
196 root 1.10 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 root 1.39 first_map_ext_path = "/start/HallsOfSelection";
223     first_map_path = "/HallOfSelection";
224 elmex 1.1 }
225    
226     /*
227 pippijn 1.21 * initialises the attack messages.
228 elmex 1.1 * Called by init_library().
229     */
230    
231     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
232    
233 root 1.10 void
234     init_attackmess (void)
235     {
236     char buf[MAX_BUF];
237     char filename[MAX_BUF];
238     char *cp, *p;
239     FILE *fp;
240     static int has_been_done = 0;
241     int mess, level, comp;
242     int mode = 0, total = 0;
243    
244     if (has_been_done)
245     return;
246     else
247     has_been_done = 1;
248    
249     sprintf (filename, "%s/attackmess", settings.datadir);
250 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
251 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
252     {
253     LOG (llevError, "Can't open %s.\n", filename);
254     return;
255 elmex 1.1 }
256    
257 root 1.10 level = 0;
258     while (fgets (buf, MAX_BUF, fp) != NULL)
259     {
260     if (*buf == '#')
261     continue;
262     if ((cp = strchr (buf, '\n')) != NULL)
263     *cp = '\0';
264     cp = buf;
265     while (*cp == ' ') /* Skip blanks */
266     cp++;
267    
268     if (strncmp (cp, "TYPE:", 5) == 0)
269     {
270     p = strtok (buf, ":");
271     p = strtok (NULL, ":");
272     if (mode == 1)
273     {
274     attack_mess[mess][level].level = -1;
275     attack_mess[mess][level].buf1 = NULL;
276     attack_mess[mess][level].buf2 = NULL;
277     attack_mess[mess][level].buf3 = NULL;
278 root 1.2 }
279 root 1.10 level = 0;
280     mess = atoi (p);
281     mode = 1;
282     continue;
283     }
284     if (mode == 1)
285     {
286     p = strtok (buf, "=");
287     attack_mess[mess][level].level = atoi (buf);
288     p = strtok (NULL, "=");
289     if (p != NULL)
290 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
291 root 1.10 else
292 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
293 root 1.10 mode = 2;
294     continue;
295     }
296     else if (mode == 2)
297     {
298     p = strtok (buf, "=");
299     attack_mess[mess][level].level = atoi (buf);
300     p = strtok (NULL, "=");
301     if (p != NULL)
302 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
303 root 1.10 else
304 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
305 root 1.10 mode = 3;
306     continue;
307 root 1.2 }
308 root 1.10 else if (mode == 3)
309     {
310     p = strtok (buf, "=");
311     attack_mess[mess][level].level = atoi (buf);
312     p = strtok (NULL, "=");
313     if (p != NULL)
314 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
315 root 1.10 else
316 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
317 root 1.10 mode = 1;
318     level++;
319     total++;
320     continue;
321 root 1.2 }
322 elmex 1.1 }
323 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
324     close_and_delete (fp, comp);
325 elmex 1.1 }