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

# Content
1 /*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 *
4 * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 *
8 * Deliantra 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 *
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, see <http://www.gnu.org/licenses/>.
20 *
21 * The authors can be reached via e-mail to <support@deliantra.net>
22 */
23
24 #define EXTERN // horrible hack
25
26 #include <global.h>
27 #include <object.h>
28
29 extern const char *const attacktype_desc[NROFATTACKS] = {
30 # define def(uc, lc, name, plus, change) # name,
31 # include "attackinc.h"
32 # undef def
33 };
34
35 extern const char *const resist_plus[NROFATTACKS] = {
36 # define def(uc, lc, name, plus, change) # plus,
37 # include "attackinc.h"
38 # undef def
39 };
40
41 extern const char *const change_resist_msg[NROFATTACKS] = {
42 # define def(uc, lc, name, plus, change) # change,
43 # include "attackinc.h"
44 # undef def
45 };
46
47 int resist_table[NROFATTACKS] = {
48 # define def(uc, lc, name, plus, change) ATNR_ ## uc,
49 # include "attackinc.h"
50 # undef def
51 };
52
53 /* You unforunately need to looking in include/global.h to see what these
54 * correspond to.
55 */
56 struct Settings settings = {
57 LOGFILE, /* Logfile */
58 CSPORT, /* Client/server port */
59
60 /* Debug level */
61 #ifdef DEBUG
62 llevDebug,
63 #else
64 llevInfo,
65 #endif
66
67 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 PK_LUCK_PENALTY,
77 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 SET_FRIENDLY_FIRE,
90 0,
91 0,
92 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 /* Armor enchantment stuff */
103 ARMOR_MAX_ENCHANT,
104 ARMOR_WEIGHT_REDUCTION,
105 ARMOR_WEIGHT_LINEAR,
106 ARMOR_SPEED_IMPROVEMENT,
107 ARMOR_SPEED_LINEAR,
108 };
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 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 };
136
137 /* init_environ initialises values from the environmental variables.
138 * it needs to be called very early, since command line options should
139 * overwrite these if specified.
140 */
141 void
142 init_environ (void)
143 {
144 char *cp;
145
146 cp = getenv ("DELIANTRA_LIBDIR");
147 if (cp)
148 settings.datadir = cp;
149
150 cp = getenv ("DELIANTRA_LOCALDIR");
151 if (cp)
152 settings.localdir = cp;
153
154 cp = getenv ("DELIANTRA_PLAYERDIR");
155 if (cp)
156 settings.playerdir = cp;
157
158 cp = getenv ("DELIANTRA_MAPDIR");
159 if (cp)
160 settings.mapdir = cp;
161
162 cp = getenv ("DELIANTRA_ARCHETYPES");
163 if (cp)
164 settings.archetypes = cp;
165
166 cp = getenv ("DELIANTRA_TREASURES");
167 if (cp)
168 settings.treasures = cp;
169
170 cp = getenv ("DELIANTRA_UNIQUEDIR");
171 if (cp)
172 settings.uniquedir = cp;
173
174 cp = getenv ("DELIANTRA_TEMPLATEDIR");
175 if (cp)
176 settings.templatedir = cp;
177
178 cp = getenv ("DELIANTRA_TMPDIR");
179 if (cp)
180 settings.tmpdir = cp;
181 }
182
183 /*
184 * Initialises all global variables.
185 * Might use environment-variables as default for some of them.
186 */
187 void
188 init_globals (void)
189 {
190 if (settings.logfilename[0] == 0)
191 set_logfd (-1);
192 else
193 {
194 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 }
204 }
205
206 void
207 init_dynamic (void)
208 {
209 first_map_ext_path = "/start/HallsOfSelection";
210 first_map_path = "/HallOfSelection";
211 }
212
213 /*
214 * initialises the attack messages.
215 * Called by init_library().
216 */
217
218 //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
219
220 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 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
238 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
239 {
240 LOG (llevError, "Can't open %s.\n", filename);
241 return;
242 }
243
244 level = 0;
245 while (fgets (buf, MAX_BUF, fp) != NULL)
246 {
247 if (*buf == '#')
248 continue;
249
250 if ((cp = strchr (buf, '\n')) != NULL)
251 *cp = '\0';
252
253 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 }
268
269 level = 0;
270 mess = atoi (p);
271 mode = 1;
272 continue;
273 }
274
275 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 attack_mess[mess][level].buf1 = strdup (p);
282 else
283 attack_mess[mess][level].buf1 = strdup ("");
284 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 attack_mess[mess][level].buf2 = strdup (p);
294 else
295 attack_mess[mess][level].buf2 = strdup ("");
296 mode = 3;
297 continue;
298 }
299 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 attack_mess[mess][level].buf3 = strdup (p);
306 else
307 attack_mess[mess][level].buf3 = strdup ("");
308 mode = 1;
309 level++;
310 total++;
311 continue;
312 }
313 }
314
315 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
316 close_and_delete (fp, comp);
317 }
318