ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.44
Committed: Tue Apr 15 03:16:02 2008 UTC (16 years, 1 month ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_5, rel-2_52, rel-2_53
Changes since 1.43: +11 -6 lines
Log Message:
better logging, remove cruft

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 if ((cp = strchr (buf, '\n')) != NULL)
250 *cp = '\0';
251 cp = buf;
252 while (*cp == ' ') /* Skip blanks */
253 cp++;
254
255 if (strncmp (cp, "TYPE:", 5) == 0)
256 {
257 p = strtok (buf, ":");
258 p = strtok (NULL, ":");
259 if (mode == 1)
260 {
261 attack_mess[mess][level].level = -1;
262 attack_mess[mess][level].buf1 = NULL;
263 attack_mess[mess][level].buf2 = NULL;
264 attack_mess[mess][level].buf3 = NULL;
265 }
266 level = 0;
267 mess = atoi (p);
268 mode = 1;
269 continue;
270 }
271 if (mode == 1)
272 {
273 p = strtok (buf, "=");
274 attack_mess[mess][level].level = atoi (buf);
275 p = strtok (NULL, "=");
276 if (p != NULL)
277 attack_mess[mess][level].buf1 = strdup (p);
278 else
279 attack_mess[mess][level].buf1 = strdup ("");
280 mode = 2;
281 continue;
282 }
283 else if (mode == 2)
284 {
285 p = strtok (buf, "=");
286 attack_mess[mess][level].level = atoi (buf);
287 p = strtok (NULL, "=");
288 if (p != NULL)
289 attack_mess[mess][level].buf2 = strdup (p);
290 else
291 attack_mess[mess][level].buf2 = strdup ("");
292 mode = 3;
293 continue;
294 }
295 else if (mode == 3)
296 {
297 p = strtok (buf, "=");
298 attack_mess[mess][level].level = atoi (buf);
299 p = strtok (NULL, "=");
300 if (p != NULL)
301 attack_mess[mess][level].buf3 = strdup (p);
302 else
303 attack_mess[mess][level].buf3 = strdup ("");
304 mode = 1;
305 level++;
306 total++;
307 continue;
308 }
309 }
310 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
311 close_and_delete (fp, comp);
312 }