ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.42
Committed: Sat Nov 10 22:41:59 2007 UTC (16 years, 6 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_4, rel-2_32, rel-2_43, rel-2_42, rel-2_41
Changes since 1.41: +9 -9 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 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 logfile = stderr;
192 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 }
197 else
198 setvbuf (logfile, NULL, _IOLBF, 0);
199 }
200
201 void
202 init_dynamic (void)
203 {
204 first_map_ext_path = "/start/HallsOfSelection";
205 first_map_path = "/HallOfSelection";
206 }
207
208 /*
209 * initialises the attack messages.
210 * Called by init_library().
211 */
212
213 //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
214
215 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 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
233 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
234 {
235 LOG (llevError, "Can't open %s.\n", filename);
236 return;
237 }
238
239 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 }
261 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 attack_mess[mess][level].buf1 = strdup (p);
273 else
274 attack_mess[mess][level].buf1 = strdup ("");
275 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 attack_mess[mess][level].buf2 = strdup (p);
285 else
286 attack_mess[mess][level].buf2 = strdup ("");
287 mode = 3;
288 continue;
289 }
290 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 attack_mess[mess][level].buf3 = strdup (p);
297 else
298 attack_mess[mess][level].buf3 = strdup ("");
299 mode = 1;
300 level++;
301 total++;
302 continue;
303 }
304 }
305 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
306 close_and_delete (fp, comp);
307 }