ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.45
Committed: Tue May 6 17:05:17 2008 UTC (16 years ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_6, rel-2_7, rel-2_54, rel-2_55, rel-2_56, rel-2_61
Changes since 1.44: +6 -0 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.44 set_logfd (-1);
192     else
193 root 1.10 {
194 root 1.44 int logfd = open (settings.logfilename, O_CREAT|O_WRONLY|O_APPEND, 0666);
195    
196     if (logfd >= 0)
197     set_logfd (logfd);
198     else
199     {
200     set_logfd (-1);
201     LOG (llevError, "Unable to open %s as the logfile - will use stderr instead", settings.logfilename);
202     }
203 elmex 1.1 }
204     }
205    
206 root 1.10 void
207     init_dynamic (void)
208     {
209 root 1.39 first_map_ext_path = "/start/HallsOfSelection";
210     first_map_path = "/HallOfSelection";
211 elmex 1.1 }
212    
213     /*
214 pippijn 1.21 * initialises the attack messages.
215 elmex 1.1 * Called by init_library().
216     */
217    
218     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
219    
220 root 1.10 void
221     init_attackmess (void)
222     {
223     char buf[MAX_BUF];
224     char filename[MAX_BUF];
225     char *cp, *p;
226     FILE *fp;
227     static int has_been_done = 0;
228     int mess, level, comp;
229     int mode = 0, total = 0;
230    
231     if (has_been_done)
232     return;
233     else
234     has_been_done = 1;
235    
236     sprintf (filename, "%s/attackmess", settings.datadir);
237 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
238 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
239     {
240     LOG (llevError, "Can't open %s.\n", filename);
241     return;
242 elmex 1.1 }
243    
244 root 1.10 level = 0;
245     while (fgets (buf, MAX_BUF, fp) != NULL)
246     {
247     if (*buf == '#')
248     continue;
249 root 1.45
250 root 1.10 if ((cp = strchr (buf, '\n')) != NULL)
251     *cp = '\0';
252 root 1.45
253 root 1.10 cp = buf;
254     while (*cp == ' ') /* Skip blanks */
255     cp++;
256    
257     if (strncmp (cp, "TYPE:", 5) == 0)
258     {
259     p = strtok (buf, ":");
260     p = strtok (NULL, ":");
261     if (mode == 1)
262     {
263     attack_mess[mess][level].level = -1;
264     attack_mess[mess][level].buf1 = NULL;
265     attack_mess[mess][level].buf2 = NULL;
266     attack_mess[mess][level].buf3 = NULL;
267 root 1.2 }
268 root 1.45
269 root 1.10 level = 0;
270     mess = atoi (p);
271     mode = 1;
272     continue;
273     }
274 root 1.45
275 root 1.10 if (mode == 1)
276     {
277     p = strtok (buf, "=");
278     attack_mess[mess][level].level = atoi (buf);
279     p = strtok (NULL, "=");
280     if (p != NULL)
281 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
282 root 1.10 else
283 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
284 root 1.10 mode = 2;
285     continue;
286     }
287     else if (mode == 2)
288     {
289     p = strtok (buf, "=");
290     attack_mess[mess][level].level = atoi (buf);
291     p = strtok (NULL, "=");
292     if (p != NULL)
293 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
294 root 1.10 else
295 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
296 root 1.10 mode = 3;
297     continue;
298 root 1.2 }
299 root 1.10 else if (mode == 3)
300     {
301     p = strtok (buf, "=");
302     attack_mess[mess][level].level = atoi (buf);
303     p = strtok (NULL, "=");
304     if (p != NULL)
305 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
306 root 1.10 else
307 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
308 root 1.10 mode = 1;
309     level++;
310     total++;
311     continue;
312 root 1.2 }
313 elmex 1.1 }
314 root 1.45
315 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
316     close_and_delete (fp, comp);
317 elmex 1.1 }
318 root 1.45