ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/init.C
Revision: 1.56
Committed: Sun Apr 11 17:27:51 2010 UTC (14 years, 1 month ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.55: +3 -3 lines
Log Message:
logfile suspend/resume

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.55 * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 root 1.54 * Copyright (©) 2002 Mark Wedel & Crossfire Development Team
6     * Copyright (©) 1992 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 root 1.53 UNIQUE_DIR, "",
78 root 1.10 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     0,
98     1.0,
99    
100 elmex 1.1 /* Armor enchantment stuff */
101 root 1.10 ARMOR_MAX_ENCHANT,
102     ARMOR_WEIGHT_REDUCTION,
103     ARMOR_WEIGHT_LINEAR,
104     ARMOR_SPEED_IMPROVEMENT,
105     ARMOR_SPEED_LINEAR,
106 elmex 1.1 };
107    
108     /* perhaps not the best place for this, but needs to be
109     * in some file in the common area so that standalone
110     * programs, like the random map generator, can be built.
111     */
112 root 1.10 const char *const spellpathnames[NRSPELLPATHS] = {
113     "Protection",
114     "Fire",
115     "Frost",
116     "Electricity",
117     "Missiles",
118     "Self",
119     "Summoning",
120     "Abjuration",
121     "Restoration",
122     "Detonation",
123     "Mind",
124     "Creation",
125     "Teleportation",
126     "Information",
127     "Transmutation",
128     "Transferrence",
129     "Turning",
130     "Wounding",
131     "Death",
132     "Light"
133 elmex 1.1 };
134    
135 pippijn 1.21 /* init_environ initialises values from the environmental variables.
136 elmex 1.1 * it needs to be called very early, since command line options should
137     * overwrite these if specified.
138     */
139 root 1.10 void
140 root 1.52 init_environ ()
141 root 1.10 {
142 root 1.46 const char *cp;
143 elmex 1.1
144 root 1.47 if (cp = getenv ("DELIANTRA_CONFDIR" )) settings.confdir = cp;
145 root 1.46 if (cp = getenv ("DELIANTRA_LIBDIR" )) settings.datadir = cp;
146     if (cp = getenv ("DELIANTRA_LOCALDIR" )) settings.localdir = cp;
147     if (cp = getenv ("DELIANTRA_PLAYERDIR" )) settings.playerdir = cp;
148     if (cp = getenv ("DELIANTRA_MAPDIR" )) settings.mapdir = cp;
149     if (cp = getenv ("DELIANTRA_ARCHETYPES" )) settings.archetypes = cp;
150     if (cp = getenv ("DELIANTRA_TREASURES" )) settings.treasures = cp;
151     if (cp = getenv ("DELIANTRA_UNIQUEDIR" )) settings.uniquedir = cp;
152     if (cp = getenv ("DELIANTRA_TEMPLATEDIR")) settings.templatedir = cp;
153     if (cp = getenv ("DELIANTRA_TMPDIR" )) settings.tmpdir = cp;
154    
155     if (cp = getenv ("DELIANTRA_LOGFILE" )) settings.logfilename = cp;
156 elmex 1.1 }
157 root 1.10
158 elmex 1.1 /*
159     * Initialises all global variables.
160     * Might use environment-variables as default for some of them.
161     */
162 root 1.10 void
163 root 1.52 init_globals ()
164 root 1.10 {
165     if (settings.logfilename[0] == 0)
166 root 1.56 log_setfd (-1);
167 root 1.44 else
168 root 1.10 {
169 root 1.44 int logfd = open (settings.logfilename, O_CREAT|O_WRONLY|O_APPEND, 0666);
170    
171     if (logfd >= 0)
172 root 1.56 log_setfd (logfd);
173 root 1.44 else
174     {
175 root 1.56 log_setfd (-1);
176 root 1.44 LOG (llevError, "Unable to open %s as the logfile - will use stderr instead", settings.logfilename);
177     }
178 elmex 1.1 }
179     }
180    
181 root 1.10 void
182 root 1.52 init_dynamic ()
183 root 1.10 {
184 root 1.39 first_map_ext_path = "/start/HallsOfSelection";
185     first_map_path = "/HallOfSelection";
186 elmex 1.1 }
187    
188     /*
189 pippijn 1.21 * initialises the attack messages.
190 elmex 1.1 * Called by init_library().
191     */
192    
193     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
194    
195 root 1.10 void
196 root 1.52 init_attackmess ()
197 root 1.10 {
198     char buf[MAX_BUF];
199     char filename[MAX_BUF];
200     char *cp, *p;
201     FILE *fp;
202     static int has_been_done = 0;
203 root 1.51 int msgnum, level, comp;
204 root 1.10 int mode = 0, total = 0;
205    
206     if (has_been_done)
207     return;
208     else
209     has_been_done = 1;
210    
211     sprintf (filename, "%s/attackmess", settings.datadir);
212 pippijn 1.20 LOG (llevDebug, "Reading attack messages from %s...\n", filename);
213 root 1.10 if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL)
214     {
215     LOG (llevError, "Can't open %s.\n", filename);
216     return;
217 elmex 1.1 }
218    
219 root 1.10 level = 0;
220     while (fgets (buf, MAX_BUF, fp) != NULL)
221     {
222     if (*buf == '#')
223     continue;
224 root 1.45
225 root 1.10 if ((cp = strchr (buf, '\n')) != NULL)
226     *cp = '\0';
227 root 1.45
228 root 1.10 cp = buf;
229     while (*cp == ' ') /* Skip blanks */
230     cp++;
231    
232     if (strncmp (cp, "TYPE:", 5) == 0)
233     {
234     p = strtok (buf, ":");
235     p = strtok (NULL, ":");
236 root 1.51
237 root 1.10 if (mode == 1)
238     {
239 root 1.51 attack_mess[msgnum][level].level = -1;
240     attack_mess[msgnum][level].buf1 = NULL;
241     attack_mess[msgnum][level].buf2 = NULL;
242     attack_mess[msgnum][level].buf3 = NULL;
243 root 1.2 }
244 root 1.45
245 root 1.10 level = 0;
246 root 1.51 msgnum = atoi (p);
247 root 1.10 mode = 1;
248     }
249 root 1.51 else if (mode == 1)
250 root 1.10 {
251     p = strtok (buf, "=");
252 root 1.51 attack_mess[msgnum][level].level = atoi (buf);
253 root 1.10 p = strtok (NULL, "=");
254 root 1.51
255 root 1.10 if (p != NULL)
256 root 1.51 attack_mess[msgnum][level].buf1 = strdup (p);
257 root 1.10 else
258 root 1.51 attack_mess[msgnum][level].buf1 = strdup ("");
259    
260 root 1.10 mode = 2;
261     }
262     else if (mode == 2)
263     {
264     p = strtok (buf, "=");
265 root 1.51 attack_mess[msgnum][level].level = atoi (buf);
266 root 1.10 p = strtok (NULL, "=");
267 root 1.51
268 root 1.10 if (p != NULL)
269 root 1.51 attack_mess[msgnum][level].buf2 = strdup (p);
270 root 1.10 else
271 root 1.51 attack_mess[msgnum][level].buf2 = strdup ("");
272    
273 root 1.10 mode = 3;
274 root 1.2 }
275 root 1.10 else if (mode == 3)
276     {
277     p = strtok (buf, "=");
278 root 1.51 attack_mess[msgnum][level].level = atoi (buf);
279 root 1.10 p = strtok (NULL, "=");
280 root 1.51
281 root 1.10 if (p != NULL)
282 root 1.51 attack_mess[msgnum][level].buf3 = strdup (p);
283 root 1.10 else
284 root 1.51 attack_mess[msgnum][level].buf3 = strdup ("");
285    
286 root 1.10 mode = 1;
287     level++;
288     total++;
289 root 1.2 }
290 elmex 1.1 }
291 root 1.45
292 root 1.51 LOG (llevDebug, "got %d messages in %d categories.\n", total, msgnum + 1);
293 root 1.10 close_and_delete (fp, comp);
294 elmex 1.1 }
295 root 1.45