ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/deliantra/server/common/init.C
Revision: 1.49
Committed: Mon Oct 12 14:00:57 2009 UTC (17 years ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_81
Changes since 1.48: +7 -6 lines
Log Message:
clarify license

File Contents

# User Rev Content
1 elmex 1.1 /*
2 root 1.41 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 pippijn 1.23 *
4 root 1.43 * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 root 1.36 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6     * Copyright (©) 1992,2007 Frank Tore Johansen
7 pippijn 1.23 *
8 root 1.49 * Deliantra is free software: you can redistribute it and/or modify it under
9     * the terms of the Affero GNU General Public License as published by the
10     * Free Software Foundation, either version 3 of the License, or (at your
11     * 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.49 * You should have received a copy of the Affero GNU General Public License
19     * and the GNU General Public License along with this program. If not, see
20     * <http://www.gnu.org/licenses/>.
21 root 1.36 *
22 root 1.41 * The authors can be reached via e-mail to <support@deliantra.net>
23 pippijn 1.23 */
24 elmex 1.1
25 root 1.10 #define EXTERN // horrible hack
26 root 1.7
27 elmex 1.1 #include <global.h>
28     #include <object.h>
29    
30 root 1.48 dynbuf_text msg_dynbuf (65536, 65536);
31    
32 root 1.10 extern const char *const attacktype_desc[NROFATTACKS] = {
33 root 1.11 # define def(uc, lc, name, plus, change) # name,
34     # include "attackinc.h"
35     # undef def
36 root 1.7 };
37    
38 root 1.10 extern const char *const resist_plus[NROFATTACKS] = {
39 root 1.11 # define def(uc, lc, name, plus, change) # plus,
40     # include "attackinc.h"
41     # undef def
42 root 1.7 };
43    
44 root 1.10 extern const char *const change_resist_msg[NROFATTACKS] = {
45 root 1.11 # define def(uc, lc, name, plus, change) # change,
46     # include "attackinc.h"
47     # undef def
48 root 1.7 };
49    
50     int resist_table[NROFATTACKS] = {
51 root 1.11 # define def(uc, lc, name, plus, change) ATNR_ ## uc,
52     # include "attackinc.h"
53     # undef def
54 root 1.7 };
55    
56 elmex 1.1 /* You unforunately need to looking in include/global.h to see what these
57     * correspond to.
58     */
59     struct Settings settings = {
60 root 1.10 LOGFILE, /* Logfile */
61     CSPORT, /* Client/server port */
62 elmex 1.1
63     /* Debug level */
64     #ifdef DEBUG
65     llevDebug,
66     #else
67     llevInfo,
68     #endif
69    
70 root 1.10 0, NULL, 0, /* dumpvalues, dumparg, daemonmode */
71     0, /* argc */
72     NULL, /* argv */
73     CONFDIR,
74     DATADIR,
75     LOCALDIR,
76     PLAYERDIR, MAPDIR, ARCHETYPES, REGIONS, TREASURES,
77     UNIQUE_DIR, TEMPLATE_DIR,
78     TMPDIR,
79 root 1.34 PK_LUCK_PENALTY,
80 root 1.10 STAT_LOSS_ON_DEATH,
81     PERMANENT_EXPERIENCE_RATIO,
82     DEATH_PENALTY_RATIO,
83     DEATH_PENALTY_LEVEL,
84     BALANCED_STAT_LOSS,
85     NOT_PERMADETH,
86     SIMPLE_EXP,
87     SET_TITLE,
88     RESURRECTION,
89     SEARCH_ITEMS,
90     SPELL_ENCUMBRANCE,
91     SPELL_FAILURE_EFFECTS,
92 root 1.34 SET_FRIENDLY_FIRE,
93 root 1.35 0,
94     0,
95 root 1.10 EXPLORE_MODE,
96     SPELLPOINT_LEVEL_DEPEND,
97     MOTD,
98     "rules",
99     "news",
100     "", /* DM_MAIL */
101     0, 0, 0, 0, 0, 0, 0, 0, /* worldmap settings */
102     0,
103     1.0,
104    
105 elmex 1.1 /* Armor enchantment stuff */
106 root 1.10 ARMOR_MAX_ENCHANT,
107     ARMOR_WEIGHT_REDUCTION,
108     ARMOR_WEIGHT_LINEAR,
109     ARMOR_SPEED_IMPROVEMENT,
110     ARMOR_SPEED_LINEAR,
111 elmex 1.1 };
112    
113     /* perhaps not the best place for this, but needs to be
114     * in some file in the common area so that standalone
115     * programs, like the random map generator, can be built.
116     */
117 root 1.10 const char *const spellpathnames[NRSPELLPATHS] = {
118     "Protection",
119     "Fire",
120     "Frost",
121     "Electricity",
122     "Missiles",
123     "Self",
124     "Summoning",
125     "Abjuration",
126     "Restoration",
127     "Detonation",
128     "Mind",
129     "Creation",
130     "Teleportation",
131     "Information",
132     "Transmutation",
133     "Transferrence",
134     "Turning",
135     "Wounding",
136     "Death",
137     "Light"
138 elmex 1.1 };
139    
140 pippijn 1.21 /* init_environ initialises values from the environmental variables.
141 elmex 1.1 * it needs to be called very early, since command line options should
142     * overwrite these if specified.
143     */
144 root 1.10 void
145     init_environ (void)
146     {
147 root 1.46 const char *cp;
148 elmex 1.1
149 root 1.47 if (cp = getenv ("DELIANTRA_CONFDIR" )) settings.confdir = cp;
150 root 1.46 if (cp = getenv ("DELIANTRA_LIBDIR" )) settings.datadir = cp;
151     if (cp = getenv ("DELIANTRA_LOCALDIR" )) settings.localdir = cp;
152     if (cp = getenv ("DELIANTRA_PLAYERDIR" )) settings.playerdir = cp;
153     if (cp = getenv ("DELIANTRA_MAPDIR" )) settings.mapdir = cp;
154     if (cp = getenv ("DELIANTRA_ARCHETYPES" )) settings.archetypes = cp;
155     if (cp = getenv ("DELIANTRA_TREASURES" )) settings.treasures = cp;
156     if (cp = getenv ("DELIANTRA_UNIQUEDIR" )) settings.uniquedir = cp;
157     if (cp = getenv ("DELIANTRA_TEMPLATEDIR")) settings.templatedir = cp;
158     if (cp = getenv ("DELIANTRA_TMPDIR" )) settings.tmpdir = cp;
159    
160     if (cp = getenv ("DELIANTRA_LOGFILE" )) settings.logfilename = cp;
161 elmex 1.1 }
162 root 1.10
163 elmex 1.1 /*
164     * Initialises all global variables.
165     * Might use environment-variables as default for some of them.
166     */
167 root 1.10 void
168     init_globals (void)
169     {
170     if (settings.logfilename[0] == 0)
171 root 1.44 set_logfd (-1);
172     else
173 root 1.10 {
174 root 1.44 int logfd = open (settings.logfilename, O_CREAT|O_WRONLY|O_APPEND, 0666);
175    
176     if (logfd >= 0)
177     set_logfd (logfd);
178     else
179     {
180     set_logfd (-1);
181     LOG (llevError, "Unable to open %s as the logfile - will use stderr instead", settings.logfilename);
182     }
183 elmex 1.1 }
184     }
185    
186 root 1.10 void
187     init_dynamic (void)
188     {
189 root 1.39 first_map_ext_path = "/start/HallsOfSelection";
190     first_map_path = "/HallOfSelection";
191 elmex 1.1 }
192    
193     /*
194 pippijn 1.21 * initialises the attack messages.
195 elmex 1.1 * Called by init_library().
196     */
197    
198     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
199    
200 root 1.10 void
201     init_attackmess (void)
202     {
203     char buf[MAX_BUF];
204     char filename[MAX_BUF];
205     char *cp, *p;
206     FILE *fp;
207     static int has_been_done = 0;
208     int mess, level, comp;
209     int mode = 0, total = 0;
210    
211     if (has_been_done)
212     return;
213     else
214     has_been_done = 1;
215    
216     sprintf (filename, "%s/attackmess", settings.datadir);
217 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
218 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
219     {
220     LOG (llevError, "Can't open %s.\n", filename);
221     return;
222 elmex 1.1 }
223    
224 root 1.10 level = 0;
225     while (fgets (buf, MAX_BUF, fp) != NULL)
226     {
227     if (*buf == '#')
228     continue;
229 root 1.45
230 root 1.10 if ((cp = strchr (buf, '\n')) != NULL)
231     *cp = '\0';
232 root 1.45
233 root 1.10 cp = buf;
234     while (*cp == ' ') /* Skip blanks */
235     cp++;
236    
237     if (strncmp (cp, "TYPE:", 5) == 0)
238     {
239     p = strtok (buf, ":");
240     p = strtok (NULL, ":");
241     if (mode == 1)
242     {
243     attack_mess[mess][level].level = -1;
244     attack_mess[mess][level].buf1 = NULL;
245     attack_mess[mess][level].buf2 = NULL;
246     attack_mess[mess][level].buf3 = NULL;
247 root 1.2 }
248 root 1.45
249 root 1.10 level = 0;
250     mess = atoi (p);
251     mode = 1;
252     continue;
253     }
254 root 1.45
255 root 1.10 if (mode == 1)
256     {
257     p = strtok (buf, "=");
258     attack_mess[mess][level].level = atoi (buf);
259     p = strtok (NULL, "=");
260     if (p != NULL)
261 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
262 root 1.10 else
263 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
264 root 1.10 mode = 2;
265     continue;
266     }
267     else if (mode == 2)
268     {
269     p = strtok (buf, "=");
270     attack_mess[mess][level].level = atoi (buf);
271     p = strtok (NULL, "=");
272     if (p != NULL)
273 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
274 root 1.10 else
275 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
276 root 1.10 mode = 3;
277     continue;
278 root 1.2 }
279 root 1.10 else if (mode == 3)
280     {
281     p = strtok (buf, "=");
282     attack_mess[mess][level].level = atoi (buf);
283     p = strtok (NULL, "=");
284     if (p != NULL)
285 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
286 root 1.10 else
287 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
288 root 1.10 mode = 1;
289     level++;
290     total++;
291     continue;
292 root 1.2 }
293 elmex 1.1 }
294 root 1.45
295 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
296     close_and_delete (fp, comp);
297 elmex 1.1 }
298 root 1.45