ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.46
Committed: Tue Sep 23 04:29:11 2008 UTC (15 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.45: +13 -36 lines
Log Message:
*** empty log message ***

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.41 * Deliantra is free software: you can redistribute it and/or modify
9 root 1.38 * 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 root 1.41 * The authors can be reached via e-mail to <support@deliantra.net>
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 pippijn 1.21 /* init_environ initialises values from the environmental variables.
138 elmex 1.1 * it needs to be called very early, since command line options should
139     * overwrite these if specified.
140     */
141 root 1.10 void
142     init_environ (void)
143     {
144 root 1.46 const char *cp;
145 elmex 1.1
146 root 1.46 if (cp = getenv ("DELIANTRA_CONFDIR" )) settings.datadir = cp;
147     if (cp = getenv ("DELIANTRA_LIBDIR" )) settings.datadir = cp;
148     if (cp = getenv ("DELIANTRA_LOCALDIR" )) settings.localdir = cp;
149     if (cp = getenv ("DELIANTRA_PLAYERDIR" )) settings.playerdir = cp;
150     if (cp = getenv ("DELIANTRA_MAPDIR" )) settings.mapdir = cp;
151     if (cp = getenv ("DELIANTRA_ARCHETYPES" )) settings.archetypes = cp;
152     if (cp = getenv ("DELIANTRA_TREASURES" )) settings.treasures = cp;
153     if (cp = getenv ("DELIANTRA_UNIQUEDIR" )) settings.uniquedir = cp;
154     if (cp = getenv ("DELIANTRA_TEMPLATEDIR")) settings.templatedir = cp;
155     if (cp = getenv ("DELIANTRA_TMPDIR" )) settings.tmpdir = cp;
156    
157     if (cp = getenv ("DELIANTRA_LOGFILE" )) settings.logfilename = cp;
158 elmex 1.1 }
159 root 1.10
160 elmex 1.1 /*
161     * Initialises all global variables.
162     * Might use environment-variables as default for some of them.
163     */
164 root 1.10 void
165     init_globals (void)
166     {
167     if (settings.logfilename[0] == 0)
168 root 1.44 set_logfd (-1);
169     else
170 root 1.10 {
171 root 1.44 int logfd = open (settings.logfilename, O_CREAT|O_WRONLY|O_APPEND, 0666);
172    
173     if (logfd >= 0)
174     set_logfd (logfd);
175     else
176     {
177     set_logfd (-1);
178     LOG (llevError, "Unable to open %s as the logfile - will use stderr instead", settings.logfilename);
179     }
180 elmex 1.1 }
181     }
182    
183 root 1.10 void
184     init_dynamic (void)
185     {
186 root 1.39 first_map_ext_path = "/start/HallsOfSelection";
187     first_map_path = "/HallOfSelection";
188 elmex 1.1 }
189    
190     /*
191 pippijn 1.21 * initialises the attack messages.
192 elmex 1.1 * Called by init_library().
193     */
194    
195     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
196    
197 root 1.10 void
198     init_attackmess (void)
199     {
200     char buf[MAX_BUF];
201     char filename[MAX_BUF];
202     char *cp, *p;
203     FILE *fp;
204     static int has_been_done = 0;
205     int mess, level, comp;
206     int mode = 0, total = 0;
207    
208     if (has_been_done)
209     return;
210     else
211     has_been_done = 1;
212    
213     sprintf (filename, "%s/attackmess", settings.datadir);
214 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
215 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
216     {
217     LOG (llevError, "Can't open %s.\n", filename);
218     return;
219 elmex 1.1 }
220    
221 root 1.10 level = 0;
222     while (fgets (buf, MAX_BUF, fp) != NULL)
223     {
224     if (*buf == '#')
225     continue;
226 root 1.45
227 root 1.10 if ((cp = strchr (buf, '\n')) != NULL)
228     *cp = '\0';
229 root 1.45
230 root 1.10 cp = buf;
231     while (*cp == ' ') /* Skip blanks */
232     cp++;
233    
234     if (strncmp (cp, "TYPE:", 5) == 0)
235     {
236     p = strtok (buf, ":");
237     p = strtok (NULL, ":");
238     if (mode == 1)
239     {
240     attack_mess[mess][level].level = -1;
241     attack_mess[mess][level].buf1 = NULL;
242     attack_mess[mess][level].buf2 = NULL;
243     attack_mess[mess][level].buf3 = NULL;
244 root 1.2 }
245 root 1.45
246 root 1.10 level = 0;
247     mess = atoi (p);
248     mode = 1;
249     continue;
250     }
251 root 1.45
252 root 1.10 if (mode == 1)
253     {
254     p = strtok (buf, "=");
255     attack_mess[mess][level].level = atoi (buf);
256     p = strtok (NULL, "=");
257     if (p != NULL)
258 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
259 root 1.10 else
260 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
261 root 1.10 mode = 2;
262     continue;
263     }
264     else if (mode == 2)
265     {
266     p = strtok (buf, "=");
267     attack_mess[mess][level].level = atoi (buf);
268     p = strtok (NULL, "=");
269     if (p != NULL)
270 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
271 root 1.10 else
272 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
273 root 1.10 mode = 3;
274     continue;
275 root 1.2 }
276 root 1.10 else if (mode == 3)
277     {
278     p = strtok (buf, "=");
279     attack_mess[mess][level].level = atoi (buf);
280     p = strtok (NULL, "=");
281     if (p != NULL)
282 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
283 root 1.10 else
284 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
285 root 1.10 mode = 1;
286     level++;
287     total++;
288     continue;
289 root 1.2 }
290 elmex 1.1 }
291 root 1.45
292 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
293     close_and_delete (fp, comp);
294 elmex 1.1 }
295 root 1.45