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

# 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.48 dynbuf_text msg_dynbuf (65536, 65536);
30    
31 root 1.10 extern const char *const attacktype_desc[NROFATTACKS] = {
32 root 1.11 # define def(uc, lc, name, plus, change) # name,
33     # include "attackinc.h"
34     # undef def
35 root 1.7 };
36    
37 root 1.10 extern const char *const resist_plus[NROFATTACKS] = {
38 root 1.11 # define def(uc, lc, name, plus, change) # plus,
39     # include "attackinc.h"
40     # undef def
41 root 1.7 };
42    
43 root 1.10 extern const char *const change_resist_msg[NROFATTACKS] = {
44 root 1.11 # define def(uc, lc, name, plus, change) # change,
45     # include "attackinc.h"
46     # undef def
47 root 1.7 };
48    
49     int resist_table[NROFATTACKS] = {
50 root 1.11 # define def(uc, lc, name, plus, change) ATNR_ ## uc,
51     # include "attackinc.h"
52     # undef def
53 root 1.7 };
54    
55 elmex 1.1 /* You unforunately need to looking in include/global.h to see what these
56     * correspond to.
57     */
58     struct Settings settings = {
59 root 1.10 LOGFILE, /* Logfile */
60     CSPORT, /* Client/server port */
61 elmex 1.1
62     /* Debug level */
63     #ifdef DEBUG
64     llevDebug,
65     #else
66     llevInfo,
67     #endif
68    
69 root 1.10 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 root 1.34 PK_LUCK_PENALTY,
79 root 1.10 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 root 1.34 SET_FRIENDLY_FIRE,
92 root 1.35 0,
93     0,
94 root 1.10 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 elmex 1.1 /* Armor enchantment stuff */
105 root 1.10 ARMOR_MAX_ENCHANT,
106     ARMOR_WEIGHT_REDUCTION,
107     ARMOR_WEIGHT_LINEAR,
108     ARMOR_SPEED_IMPROVEMENT,
109     ARMOR_SPEED_LINEAR,
110 elmex 1.1 };
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 root 1.10 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 elmex 1.1 };
138    
139 pippijn 1.21 /* init_environ initialises values from the environmental variables.
140 elmex 1.1 * it needs to be called very early, since command line options should
141     * overwrite these if specified.
142     */
143 root 1.10 void
144     init_environ (void)
145     {
146 root 1.46 const char *cp;
147 elmex 1.1
148 root 1.47 if (cp = getenv ("DELIANTRA_CONFDIR" )) settings.confdir = cp;
149 root 1.46 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 elmex 1.1 }
161 root 1.10
162 elmex 1.1 /*
163     * Initialises all global variables.
164     * Might use environment-variables as default for some of them.
165     */
166 root 1.10 void
167     init_globals (void)
168     {
169     if (settings.logfilename[0] == 0)
170 root 1.44 set_logfd (-1);
171     else
172 root 1.10 {
173 root 1.44 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 elmex 1.1 }
183     }
184    
185 root 1.10 void
186     init_dynamic (void)
187     {
188 root 1.39 first_map_ext_path = "/start/HallsOfSelection";
189     first_map_path = "/HallOfSelection";
190 elmex 1.1 }
191    
192     /*
193 pippijn 1.21 * initialises the attack messages.
194 elmex 1.1 * Called by init_library().
195     */
196    
197     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
198    
199 root 1.10 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 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
217 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
218     {
219     LOG (llevError, "Can't open %s.\n", filename);
220     return;
221 elmex 1.1 }
222    
223 root 1.10 level = 0;
224     while (fgets (buf, MAX_BUF, fp) != NULL)
225     {
226     if (*buf == '#')
227     continue;
228 root 1.45
229 root 1.10 if ((cp = strchr (buf, '\n')) != NULL)
230     *cp = '\0';
231 root 1.45
232 root 1.10 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 root 1.2 }
247 root 1.45
248 root 1.10 level = 0;
249     mess = atoi (p);
250     mode = 1;
251     continue;
252     }
253 root 1.45
254 root 1.10 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 root 1.16 attack_mess[mess][level].buf1 = strdup (p);
261 root 1.10 else
262 root 1.16 attack_mess[mess][level].buf1 = strdup ("");
263 root 1.10 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 root 1.16 attack_mess[mess][level].buf2 = strdup (p);
273 root 1.10 else
274 root 1.16 attack_mess[mess][level].buf2 = strdup ("");
275 root 1.10 mode = 3;
276     continue;
277 root 1.2 }
278 root 1.10 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 root 1.16 attack_mess[mess][level].buf3 = strdup (p);
285 root 1.10 else
286 root 1.16 attack_mess[mess][level].buf3 = strdup ("");
287 root 1.10 mode = 1;
288     level++;
289     total++;
290     continue;
291 root 1.2 }
292 elmex 1.1 }
293 root 1.45
294 root 1.10 LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1);
295     close_and_delete (fp, comp);
296 elmex 1.1 }
297 root 1.45