ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.39
Committed: Mon Jul 16 09:07:12 2007 UTC (16 years, 10 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.38: +2 -17 lines
Log Message:
hardcode map start paths for now (and likely forever)

File Contents

# Content
1 /*
2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 *
8 * Crossfire TRT 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 <crossfire@schmorp.de>
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 /*
138 * It is vital that init_library() is called by any functions
139 * using this library.
140 * If you want to lessen the size of the program using the library,
141 * you can replace the call to init_library() with init_globals() and
142 * init_function_pointers(). Good idea to also call init_vars and
143 * init_hash_table if you are doing any object loading.
144 */
145 void
146 init_library (void)
147 {
148 init_globals ();
149 init_block ();
150 init_dynamic ();
151 init_attackmess ();
152 init_experience ();
153 }
154
155 /* init_environ initialises values from the environmental variables.
156 * it needs to be called very early, since command line options should
157 * overwrite these if specified.
158 */
159 void
160 init_environ (void)
161 {
162 char *cp;
163
164 cp = getenv ("CROSSFIRE_LIBDIR");
165 if (cp)
166 settings.datadir = cp;
167
168 cp = getenv ("CROSSFIRE_LOCALDIR");
169 if (cp)
170 settings.localdir = cp;
171
172 cp = getenv ("CROSSFIRE_PLAYERDIR");
173 if (cp)
174 settings.playerdir = cp;
175
176 cp = getenv ("CROSSFIRE_MAPDIR");
177 if (cp)
178 settings.mapdir = cp;
179
180 cp = getenv ("CROSSFIRE_ARCHETYPES");
181 if (cp)
182 settings.archetypes = cp;
183
184 cp = getenv ("CROSSFIRE_TREASURES");
185 if (cp)
186 settings.treasures = cp;
187
188 cp = getenv ("CROSSFIRE_UNIQUEDIR");
189 if (cp)
190 settings.uniquedir = cp;
191
192 cp = getenv ("CROSSFIRE_TEMPLATEDIR");
193 if (cp)
194 settings.templatedir = cp;
195
196 cp = getenv ("CROSSFIRE_TMPDIR");
197 if (cp)
198 settings.tmpdir = cp;
199 }
200
201 /*
202 * Initialises all global variables.
203 * Might use environment-variables as default for some of them.
204 */
205 void
206 init_globals (void)
207 {
208 if (settings.logfilename[0] == 0)
209 logfile = stderr;
210 else if ((logfile = fopen (settings.logfilename, "a")) == NULL)
211 {
212 fprintf (stderr, "Unable to open %s as the logfile - will use stderr instead\n", settings.logfilename);
213 logfile = stderr;
214 }
215 else
216 setvbuf (logfile, NULL, _IOLBF, 0);
217 }
218
219 void
220 init_dynamic (void)
221 {
222 first_map_ext_path = "/start/HallsOfSelection";
223 first_map_path = "/HallOfSelection";
224 }
225
226 /*
227 * initialises the attack messages.
228 * Called by init_library().
229 */
230
231 //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
232
233 void
234 init_attackmess (void)
235 {
236 char buf[MAX_BUF];
237 char filename[MAX_BUF];
238 char *cp, *p;
239 FILE *fp;
240 static int has_been_done = 0;
241 int mess, level, comp;
242 int mode = 0, total = 0;
243
244 if (has_been_done)
245 return;
246 else
247 has_been_done = 1;
248
249 sprintf (filename, "%s/attackmess", settings.datadir);
250 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
251 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
252 {
253 LOG (llevError, "Can't open %s.\n", filename);
254 return;
255 }
256
257 level = 0;
258 while (fgets (buf, MAX_BUF, fp) != NULL)
259 {
260 if (*buf == '#')
261 continue;
262 if ((cp = strchr (buf, '\n')) != NULL)
263 *cp = '\0';
264 cp = buf;
265 while (*cp == ' ') /* Skip blanks */
266 cp++;
267
268 if (strncmp (cp, "TYPE:", 5) == 0)
269 {
270 p = strtok (buf, ":");
271 p = strtok (NULL, ":");
272 if (mode == 1)
273 {
274 attack_mess[mess][level].level = -1;
275 attack_mess[mess][level].buf1 = NULL;
276 attack_mess[mess][level].buf2 = NULL;
277 attack_mess[mess][level].buf3 = NULL;
278 }
279 level = 0;
280 mess = atoi (p);
281 mode = 1;
282 continue;
283 }
284 if (mode == 1)
285 {
286 p = strtok (buf, "=");
287 attack_mess[mess][level].level = atoi (buf);
288 p = strtok (NULL, "=");
289 if (p != NULL)
290 attack_mess[mess][level].buf1 = strdup (p);
291 else
292 attack_mess[mess][level].buf1 = strdup ("");
293 mode = 2;
294 continue;
295 }
296 else if (mode == 2)
297 {
298 p = strtok (buf, "=");
299 attack_mess[mess][level].level = atoi (buf);
300 p = strtok (NULL, "=");
301 if (p != NULL)
302 attack_mess[mess][level].buf2 = strdup (p);
303 else
304 attack_mess[mess][level].buf2 = strdup ("");
305 mode = 3;
306 continue;
307 }
308 else if (mode == 3)
309 {
310 p = strtok (buf, "=");
311 attack_mess[mess][level].level = atoi (buf);
312 p = strtok (NULL, "=");
313 if (p != NULL)
314 attack_mess[mess][level].buf3 = strdup (p);
315 else
316 attack_mess[mess][level].buf3 = strdup ("");
317 mode = 1;
318 level++;
319 total++;
320 continue;
321 }
322 }
323 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
324 close_and_delete (fp, comp);
325 }