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

# User Rev Content
1 elmex 1.1 /*
2 root 1.38 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3 pippijn 1.23 *
4 root 1.36 * 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 pippijn 1.23 *
8 root 1.38 * 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 pippijn 1.23 *
13 root 1.38 * 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 pippijn 1.23 *
18 root 1.38 * 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 root 1.36 *
21     * The authors can be reached via e-mail to <crossfire@schmorp.de>
22 pippijn 1.23 */
23 elmex 1.1
24 root 1.10 #define EXTERN // horrible hack
25 root 1.7
26 elmex 1.1 #include <global.h>
27     #include <object.h>
28    
29 root 1.10 extern const char *const attacktype_desc[NROFATTACKS] = {
30 root 1.11 # define def(uc, lc, name, plus, change) # name,
31     # include "attackinc.h"
32     # undef def
33 root 1.7 };
34    
35 root 1.10 extern const char *const resist_plus[NROFATTACKS] = {
36 root 1.11 # define def(uc, lc, name, plus, change) # plus,
37     # include "attackinc.h"
38     # undef def
39 root 1.7 };
40    
41 root 1.10 extern const char *const change_resist_msg[NROFATTACKS] = {
42 root 1.11 # define def(uc, lc, name, plus, change) # change,
43     # include "attackinc.h"
44     # undef def
45 root 1.7 };
46    
47     int resist_table[NROFATTACKS] = {
48 root 1.11 # define def(uc, lc, name, plus, change) ATNR_ ## uc,
49     # include "attackinc.h"
50     # undef def
51 root 1.7 };
52    
53 elmex 1.1 /* You unforunately need to looking in include/global.h to see what these
54     * correspond to.
55     */
56     struct Settings settings = {
57 root 1.10 LOGFILE, /* Logfile */
58     CSPORT, /* Client/server port */
59 elmex 1.1
60     /* Debug level */
61     #ifdef DEBUG
62     llevDebug,
63     #else
64     llevInfo,
65     #endif
66    
67 root 1.10 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 root 1.34 PK_LUCK_PENALTY,
77 root 1.10 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 root 1.34 SET_FRIENDLY_FIRE,
90 root 1.35 0,
91     0,
92 root 1.10 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 elmex 1.1 /* Armor enchantment stuff */
103 root 1.10 ARMOR_MAX_ENCHANT,
104     ARMOR_WEIGHT_REDUCTION,
105     ARMOR_WEIGHT_LINEAR,
106     ARMOR_SPEED_IMPROVEMENT,
107     ARMOR_SPEED_LINEAR,
108 elmex 1.1 };
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 root 1.10 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 elmex 1.1 };
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 root 1.10 void
146     init_library (void)
147     {
148     init_globals ();
149     init_block ();
150     init_dynamic ();
151     init_attackmess ();
152     init_experience ();
153 elmex 1.1 }
154    
155 pippijn 1.21 /* init_environ initialises values from the environmental variables.
156 elmex 1.1 * it needs to be called very early, since command line options should
157     * overwrite these if specified.
158     */
159 root 1.10 void
160     init_environ (void)
161     {
162     char *cp;
163 elmex 1.1
164 root 1.10 cp = getenv ("CROSSFIRE_LIBDIR");
165     if (cp)
166     settings.datadir = cp;
167 root 1.33
168 root 1.10 cp = getenv ("CROSSFIRE_LOCALDIR");
169     if (cp)
170     settings.localdir = cp;
171 root 1.33
172 root 1.10 cp = getenv ("CROSSFIRE_PLAYERDIR");
173     if (cp)
174     settings.playerdir = cp;
175 root 1.33
176 root 1.10 cp = getenv ("CROSSFIRE_MAPDIR");
177     if (cp)
178     settings.mapdir = cp;
179 root 1.33
180 root 1.10 cp = getenv ("CROSSFIRE_ARCHETYPES");
181     if (cp)
182     settings.archetypes = cp;
183 root 1.33
184 root 1.10 cp = getenv ("CROSSFIRE_TREASURES");
185     if (cp)
186     settings.treasures = cp;
187 root 1.33
188 root 1.10 cp = getenv ("CROSSFIRE_UNIQUEDIR");
189     if (cp)
190     settings.uniquedir = cp;
191 root 1.33
192 root 1.10 cp = getenv ("CROSSFIRE_TEMPLATEDIR");
193     if (cp)
194     settings.templatedir = cp;
195 root 1.33
196 root 1.10 cp = getenv ("CROSSFIRE_TMPDIR");
197     if (cp)
198     settings.tmpdir = cp;
199 elmex 1.1 }
200 root 1.10
201 elmex 1.1 /*
202     * Initialises all global variables.
203     * Might use environment-variables as default for some of them.
204     */
205 root 1.10 void
206     init_globals (void)
207     {
208     if (settings.logfilename[0] == 0)
209 root 1.12 logfile = stderr;
210 root 1.10 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 elmex 1.1 }
215 root 1.10 else
216 root 1.12 setvbuf (logfile, NULL, _IOLBF, 0);
217 elmex 1.1 }
218    
219 root 1.10 void
220     init_dynamic (void)
221     {
222 root 1.37 for_all_archetypes (at)
223 root 1.10 {
224 root 1.37 if (at->type == MAP)
225 root 1.10 {
226 root 1.37 if (at->race)
227     first_map_ext_path = at->race;
228 root 1.12
229 root 1.37 if (EXIT_PATH (at))
230 root 1.10 {
231 root 1.37 first_map_path = EXIT_PATH (at);
232 root 1.10 return;
233 elmex 1.1 }
234 root 1.2 }
235 elmex 1.1 }
236 root 1.12
237 root 1.32 LOG (llevDebug, "You need an archetype of type 'map' and it has to contain the player start map\n");
238 root 1.10 exit (-1);
239 elmex 1.1 }
240    
241     /*
242 pippijn 1.21 * initialises the attack messages.
243 elmex 1.1 * Called by init_library().
244     */
245    
246     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
247    
248 root 1.10 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 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
266 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
267     {
268     LOG (llevError, "Can't open %s.\n", filename);
269     return;
270 elmex 1.1 }
271    
272 root 1.10 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 root 1.2 }
294 root 1.10 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 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
306 root 1.10 else
307 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
308 root 1.10 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 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
318 root 1.10 else
319 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
320 root 1.10 mode = 3;
321     continue;
322 root 1.2 }
323 root 1.10 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 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
330 root 1.10 else
331 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
332 root 1.10 mode = 1;
333     level++;
334     total++;
335     continue;
336 root 1.2 }
337 elmex 1.1 }
338 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
339     close_and_delete (fp, comp);
340 elmex 1.1 }