ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.38
Committed: Sun Jul 1 05:00:17 2007 UTC (16 years, 10 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.37: +11 -12 lines
Log Message:
- upgrade crossfire trt to the GPL version 3 (hopefully correctly).
- add a single file covered by the GNU Affero General Public License
  (which is not yet released, so I used the current draft, which is
  legally a bit wavy, but its likely better than nothing as it expresses
  direct intent by the authors, and we can upgrade as soon as it has been
  released).
  * this should ensure availability of source code for the server at least
    and hopefully also archetypes and maps even when modified versions
    are not being distributed, in accordance of section 13 of the agplv3.

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 for_all_archetypes (at)
223 {
224 if (at->type == MAP)
225 {
226 if (at->race)
227 first_map_ext_path = at->race;
228
229 if (EXIT_PATH (at))
230 {
231 first_map_path = EXIT_PATH (at);
232 return;
233 }
234 }
235 }
236
237 LOG (llevDebug, "You need an archetype of type 'map' and it has to contain the player start map\n");
238 exit (-1);
239 }
240
241 /*
242 * initialises the attack messages.
243 * Called by init_library().
244 */
245
246 //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
247
248 void
249 init_attackmess (void)
250 {
251 char buf[MAX_BUF];
252 char filename[MAX_BUF];
253 char *cp, *p;
254 FILE *fp;
255 static int has_been_done = 0;
256 int mess, level, comp;
257 int mode = 0, total = 0;
258
259 if (has_been_done)
260 return;
261 else
262 has_been_done = 1;
263
264 sprintf (filename, "%s/attackmess", settings.datadir);
265 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
266 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
267 {
268 LOG (llevError, "Can't open %s.\n", filename);
269 return;
270 }
271
272 level = 0;
273 while (fgets (buf, MAX_BUF, fp) != NULL)
274 {
275 if (*buf == '#')
276 continue;
277 if ((cp = strchr (buf, '\n')) != NULL)
278 *cp = '\0';
279 cp = buf;
280 while (*cp == ' ') /* Skip blanks */
281 cp++;
282
283 if (strncmp (cp, "TYPE:", 5) == 0)
284 {
285 p = strtok (buf, ":");
286 p = strtok (NULL, ":");
287 if (mode == 1)
288 {
289 attack_mess[mess][level].level = -1;
290 attack_mess[mess][level].buf1 = NULL;
291 attack_mess[mess][level].buf2 = NULL;
292 attack_mess[mess][level].buf3 = NULL;
293 }
294 level = 0;
295 mess = atoi (p);
296 mode = 1;
297 continue;
298 }
299 if (mode == 1)
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].buf1 = strdup (p);
306 else
307 attack_mess[mess][level].buf1 = strdup ("");
308 mode = 2;
309 continue;
310 }
311 else if (mode == 2)
312 {
313 p = strtok (buf, "=");
314 attack_mess[mess][level].level = atoi (buf);
315 p = strtok (NULL, "=");
316 if (p != NULL)
317 attack_mess[mess][level].buf2 = strdup (p);
318 else
319 attack_mess[mess][level].buf2 = strdup ("");
320 mode = 3;
321 continue;
322 }
323 else if (mode == 3)
324 {
325 p = strtok (buf, "=");
326 attack_mess[mess][level].level = atoi (buf);
327 p = strtok (NULL, "=");
328 if (p != NULL)
329 attack_mess[mess][level].buf3 = strdup (p);
330 else
331 attack_mess[mess][level].buf3 = strdup ("");
332 mode = 1;
333 level++;
334 total++;
335 continue;
336 }
337 }
338 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
339 close_and_delete (fp, comp);
340 }