ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.48
Committed: Mon Apr 27 01:38:48 2009 UTC (15 years, 1 month ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_80, rel-2_79
Changes since 1.47: +2 -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 dynbuf_text msg_dynbuf (65536, 65536);
30
31 extern const char *const attacktype_desc[NROFATTACKS] = {
32 # define def(uc, lc, name, plus, change) # name,
33 # include "attackinc.h"
34 # undef def
35 };
36
37 extern const char *const resist_plus[NROFATTACKS] = {
38 # define def(uc, lc, name, plus, change) # plus,
39 # include "attackinc.h"
40 # undef def
41 };
42
43 extern const char *const change_resist_msg[NROFATTACKS] = {
44 # define def(uc, lc, name, plus, change) # change,
45 # include "attackinc.h"
46 # undef def
47 };
48
49 int resist_table[NROFATTACKS] = {
50 # define def(uc, lc, name, plus, change) ATNR_ ## uc,
51 # include "attackinc.h"
52 # undef def
53 };
54
55 /* You unforunately need to looking in include/global.h to see what these
56 * correspond to.
57 */
58 struct Settings settings = {
59 LOGFILE, /* Logfile */
60 CSPORT, /* Client/server port */
61
62 /* Debug level */
63 #ifdef DEBUG
64 llevDebug,
65 #else
66 llevInfo,
67 #endif
68
69 0, NULL, 0, /* dumpvalues, dumparg, daemonmode */
70 0, /* argc */
71 NULL, /* argv */
72 CONFDIR,
73 DATADIR,
74 LOCALDIR,
75 PLAYERDIR, MAPDIR, ARCHETYPES, REGIONS, TREASURES,
76 UNIQUE_DIR, TEMPLATE_DIR,
77 TMPDIR,
78 PK_LUCK_PENALTY,
79 STAT_LOSS_ON_DEATH,
80 PERMANENT_EXPERIENCE_RATIO,
81 DEATH_PENALTY_RATIO,
82 DEATH_PENALTY_LEVEL,
83 BALANCED_STAT_LOSS,
84 NOT_PERMADETH,
85 SIMPLE_EXP,
86 SET_TITLE,
87 RESURRECTION,
88 SEARCH_ITEMS,
89 SPELL_ENCUMBRANCE,
90 SPELL_FAILURE_EFFECTS,
91 SET_FRIENDLY_FIRE,
92 0,
93 0,
94 EXPLORE_MODE,
95 SPELLPOINT_LEVEL_DEPEND,
96 MOTD,
97 "rules",
98 "news",
99 "", /* DM_MAIL */
100 0, 0, 0, 0, 0, 0, 0, 0, /* worldmap settings */
101 0,
102 1.0,
103
104 /* Armor enchantment stuff */
105 ARMOR_MAX_ENCHANT,
106 ARMOR_WEIGHT_REDUCTION,
107 ARMOR_WEIGHT_LINEAR,
108 ARMOR_SPEED_IMPROVEMENT,
109 ARMOR_SPEED_LINEAR,
110 };
111
112 /* perhaps not the best place for this, but needs to be
113 * in some file in the common area so that standalone
114 * programs, like the random map generator, can be built.
115 */
116 const char *const spellpathnames[NRSPELLPATHS] = {
117 "Protection",
118 "Fire",
119 "Frost",
120 "Electricity",
121 "Missiles",
122 "Self",
123 "Summoning",
124 "Abjuration",
125 "Restoration",
126 "Detonation",
127 "Mind",
128 "Creation",
129 "Teleportation",
130 "Information",
131 "Transmutation",
132 "Transferrence",
133 "Turning",
134 "Wounding",
135 "Death",
136 "Light"
137 };
138
139 /* init_environ initialises values from the environmental variables.
140 * it needs to be called very early, since command line options should
141 * overwrite these if specified.
142 */
143 void
144 init_environ (void)
145 {
146 const char *cp;
147
148 if (cp = getenv ("DELIANTRA_CONFDIR" )) settings.confdir = cp;
149 if (cp = getenv ("DELIANTRA_LIBDIR" )) settings.datadir = cp;
150 if (cp = getenv ("DELIANTRA_LOCALDIR" )) settings.localdir = cp;
151 if (cp = getenv ("DELIANTRA_PLAYERDIR" )) settings.playerdir = cp;
152 if (cp = getenv ("DELIANTRA_MAPDIR" )) settings.mapdir = cp;
153 if (cp = getenv ("DELIANTRA_ARCHETYPES" )) settings.archetypes = cp;
154 if (cp = getenv ("DELIANTRA_TREASURES" )) settings.treasures = cp;
155 if (cp = getenv ("DELIANTRA_UNIQUEDIR" )) settings.uniquedir = cp;
156 if (cp = getenv ("DELIANTRA_TEMPLATEDIR")) settings.templatedir = cp;
157 if (cp = getenv ("DELIANTRA_TMPDIR" )) settings.tmpdir = cp;
158
159 if (cp = getenv ("DELIANTRA_LOGFILE" )) settings.logfilename = cp;
160 }
161
162 /*
163 * Initialises all global variables.
164 * Might use environment-variables as default for some of them.
165 */
166 void
167 init_globals (void)
168 {
169 if (settings.logfilename[0] == 0)
170 set_logfd (-1);
171 else
172 {
173 int logfd = open (settings.logfilename, O_CREAT|O_WRONLY|O_APPEND, 0666);
174
175 if (logfd >= 0)
176 set_logfd (logfd);
177 else
178 {
179 set_logfd (-1);
180 LOG (llevError, "Unable to open %s as the logfile - will use stderr instead", settings.logfilename);
181 }
182 }
183 }
184
185 void
186 init_dynamic (void)
187 {
188 first_map_ext_path = "/start/HallsOfSelection";
189 first_map_path = "/HallOfSelection";
190 }
191
192 /*
193 * initialises the attack messages.
194 * Called by init_library().
195 */
196
197 //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
198
199 void
200 init_attackmess (void)
201 {
202 char buf[MAX_BUF];
203 char filename[MAX_BUF];
204 char *cp, *p;
205 FILE *fp;
206 static int has_been_done = 0;
207 int mess, level, comp;
208 int mode = 0, total = 0;
209
210 if (has_been_done)
211 return;
212 else
213 has_been_done = 1;
214
215 sprintf (filename, "%s/attackmess", settings.datadir);
216 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
217 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
218 {
219 LOG (llevError, "Can't open %s.\n", filename);
220 return;
221 }
222
223 level = 0;
224 while (fgets (buf, MAX_BUF, fp) != NULL)
225 {
226 if (*buf == '#')
227 continue;
228
229 if ((cp = strchr (buf, '\n')) != NULL)
230 *cp = '\0';
231
232 cp = buf;
233 while (*cp == ' ') /* Skip blanks */
234 cp++;
235
236 if (strncmp (cp, "TYPE:", 5) == 0)
237 {
238 p = strtok (buf, ":");
239 p = strtok (NULL, ":");
240 if (mode == 1)
241 {
242 attack_mess[mess][level].level = -1;
243 attack_mess[mess][level].buf1 = NULL;
244 attack_mess[mess][level].buf2 = NULL;
245 attack_mess[mess][level].buf3 = NULL;
246 }
247
248 level = 0;
249 mess = atoi (p);
250 mode = 1;
251 continue;
252 }
253
254 if (mode == 1)
255 {
256 p = strtok (buf, "=");
257 attack_mess[mess][level].level = atoi (buf);
258 p = strtok (NULL, "=");
259 if (p != NULL)
260 attack_mess[mess][level].buf1 = strdup (p);
261 else
262 attack_mess[mess][level].buf1 = strdup ("");
263 mode = 2;
264 continue;
265 }
266 else if (mode == 2)
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].buf2 = strdup (p);
273 else
274 attack_mess[mess][level].buf2 = strdup ("");
275 mode = 3;
276 continue;
277 }
278 else if (mode == 3)
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].buf3 = strdup (p);
285 else
286 attack_mess[mess][level].buf3 = strdup ("");
287 mode = 1;
288 level++;
289 total++;
290 continue;
291 }
292 }
293
294 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
295 close_and_delete (fp, comp);
296 }
297