ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.43
Committed: Fri Apr 11 21:09:52 2008 UTC (16 years, 1 month ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.42: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 elmex 1.1 /*
2 root 1.41 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 pippijn 1.23 *
4 root 1.43 * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 root 1.36 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6     * Copyright (©) 1992,2007 Frank Tore Johansen
7 pippijn 1.23 *
8 root 1.41 * Deliantra is free software: you can redistribute it and/or modify
9 root 1.38 * 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 root 1.41 * The authors can be reached via e-mail to <support@deliantra.net>
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 pippijn 1.21 /* init_environ initialises values from the environmental variables.
138 elmex 1.1 * it needs to be called very early, since command line options should
139     * overwrite these if specified.
140     */
141 root 1.10 void
142     init_environ (void)
143     {
144     char *cp;
145 elmex 1.1
146 root 1.42 cp = getenv ("DELIANTRA_LIBDIR");
147 root 1.10 if (cp)
148     settings.datadir = cp;
149 root 1.33
150 root 1.42 cp = getenv ("DELIANTRA_LOCALDIR");
151 root 1.10 if (cp)
152     settings.localdir = cp;
153 root 1.33
154 root 1.42 cp = getenv ("DELIANTRA_PLAYERDIR");
155 root 1.10 if (cp)
156     settings.playerdir = cp;
157 root 1.33
158 root 1.42 cp = getenv ("DELIANTRA_MAPDIR");
159 root 1.10 if (cp)
160     settings.mapdir = cp;
161 root 1.33
162 root 1.42 cp = getenv ("DELIANTRA_ARCHETYPES");
163 root 1.10 if (cp)
164     settings.archetypes = cp;
165 root 1.33
166 root 1.42 cp = getenv ("DELIANTRA_TREASURES");
167 root 1.10 if (cp)
168     settings.treasures = cp;
169 root 1.33
170 root 1.42 cp = getenv ("DELIANTRA_UNIQUEDIR");
171 root 1.10 if (cp)
172     settings.uniquedir = cp;
173 root 1.33
174 root 1.42 cp = getenv ("DELIANTRA_TEMPLATEDIR");
175 root 1.10 if (cp)
176     settings.templatedir = cp;
177 root 1.33
178 root 1.42 cp = getenv ("DELIANTRA_TMPDIR");
179 root 1.10 if (cp)
180     settings.tmpdir = cp;
181 elmex 1.1 }
182 root 1.10
183 elmex 1.1 /*
184     * Initialises all global variables.
185     * Might use environment-variables as default for some of them.
186     */
187 root 1.10 void
188     init_globals (void)
189     {
190     if (settings.logfilename[0] == 0)
191 root 1.12 logfile = stderr;
192 root 1.10 else if ((logfile = fopen (settings.logfilename, "a")) == NULL)
193     {
194     fprintf (stderr, "Unable to open %s as the logfile - will use stderr instead\n", settings.logfilename);
195     logfile = stderr;
196 elmex 1.1 }
197 root 1.10 else
198 root 1.12 setvbuf (logfile, NULL, _IOLBF, 0);
199 elmex 1.1 }
200    
201 root 1.10 void
202     init_dynamic (void)
203     {
204 root 1.39 first_map_ext_path = "/start/HallsOfSelection";
205     first_map_path = "/HallOfSelection";
206 elmex 1.1 }
207    
208     /*
209 pippijn 1.21 * initialises the attack messages.
210 elmex 1.1 * Called by init_library().
211     */
212    
213     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
214    
215 root 1.10 void
216     init_attackmess (void)
217     {
218     char buf[MAX_BUF];
219     char filename[MAX_BUF];
220     char *cp, *p;
221     FILE *fp;
222     static int has_been_done = 0;
223     int mess, level, comp;
224     int mode = 0, total = 0;
225    
226     if (has_been_done)
227     return;
228     else
229     has_been_done = 1;
230    
231     sprintf (filename, "%s/attackmess", settings.datadir);
232 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
233 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
234     {
235     LOG (llevError, "Can't open %s.\n", filename);
236     return;
237 elmex 1.1 }
238    
239 root 1.10 level = 0;
240     while (fgets (buf, MAX_BUF, fp) != NULL)
241     {
242     if (*buf == '#')
243     continue;
244     if ((cp = strchr (buf, '\n')) != NULL)
245     *cp = '\0';
246     cp = buf;
247     while (*cp == ' ') /* Skip blanks */
248     cp++;
249    
250     if (strncmp (cp, "TYPE:", 5) == 0)
251     {
252     p = strtok (buf, ":");
253     p = strtok (NULL, ":");
254     if (mode == 1)
255     {
256     attack_mess[mess][level].level = -1;
257     attack_mess[mess][level].buf1 = NULL;
258     attack_mess[mess][level].buf2 = NULL;
259     attack_mess[mess][level].buf3 = NULL;
260 root 1.2 }
261 root 1.10 level = 0;
262     mess = atoi (p);
263     mode = 1;
264     continue;
265     }
266     if (mode == 1)
267     {
268     p = strtok (buf, "=");
269     attack_mess[mess][level].level = atoi (buf);
270     p = strtok (NULL, "=");
271     if (p != NULL)
272 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
273 root 1.10 else
274 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
275 root 1.10 mode = 2;
276     continue;
277     }
278     else if (mode == 2)
279     {
280     p = strtok (buf, "=");
281     attack_mess[mess][level].level = atoi (buf);
282     p = strtok (NULL, "=");
283     if (p != NULL)
284 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
285 root 1.10 else
286 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
287 root 1.10 mode = 3;
288     continue;
289 root 1.2 }
290 root 1.10 else if (mode == 3)
291     {
292     p = strtok (buf, "=");
293     attack_mess[mess][level].level = atoi (buf);
294     p = strtok (NULL, "=");
295     if (p != NULL)
296 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
297 root 1.10 else
298 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
299 root 1.10 mode = 1;
300     level++;
301     total++;
302     continue;
303 root 1.2 }
304 elmex 1.1 }
305 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
306     close_and_delete (fp, comp);
307 elmex 1.1 }