ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/deliantra/server/common/init.C
Revision: 1.61
Committed: Mon Oct 11 18:40:43 2010 UTC (16 years ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.60: +10 -4 lines
Log Message:
resists_xxx body_xxx_yyy match

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.61 extern const char *const attacktype_name[NROFATTACKS] = {
33     # define def(uc, lc, desc, plus, change) # lc,
34     # include "attackinc.h"
35     # undef def
36     };
37    
38 root 1.10 extern const char *const attacktype_desc[NROFATTACKS] = {
39 root 1.61 # define def(uc, lc, desc, plus, change) # desc,
40 root 1.11 # include "attackinc.h"
41     # undef def
42 root 1.7 };
43    
44 root 1.10 extern const char *const resist_plus[NROFATTACKS] = {
45 root 1.61 # define def(uc, lc, desc, plus, change) # plus,
46 root 1.11 # include "attackinc.h"
47     # undef def
48 root 1.7 };
49    
50 root 1.10 extern const char *const change_resist_msg[NROFATTACKS] = {
51 root 1.61 # define def(uc, lc, desc, plus, change) # change,
52 root 1.11 # include "attackinc.h"
53     # undef def
54 root 1.7 };
55    
56     int resist_table[NROFATTACKS] = {
57 root 1.61 # define def(uc, lc, desc, plus, change) ATNR_ ## uc,
58 root 1.11 # include "attackinc.h"
59     # undef def
60 root 1.7 };
61    
62 elmex 1.1 /* You unforunately need to looking in include/global.h to see what these
63     * correspond to.
64     */
65     struct Settings settings = {
66 root 1.10 LOGFILE, /* Logfile */
67     CSPORT, /* Client/server port */
68 root 1.59 llevTrace, /* Log level */
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 root 1.53 UNIQUE_DIR, "",
77 root 1.10 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     0,
97 root 1.60 1.25,
98 root 1.10
99 elmex 1.1 /* Armor enchantment stuff */
100 root 1.10 ARMOR_MAX_ENCHANT,
101     ARMOR_WEIGHT_REDUCTION,
102     ARMOR_WEIGHT_LINEAR,
103     ARMOR_SPEED_IMPROVEMENT,
104     ARMOR_SPEED_LINEAR,
105 elmex 1.1 };
106    
107     /* perhaps not the best place for this, but needs to be
108     * in some file in the common area so that standalone
109     * programs, like the random map generator, can be built.
110     */
111 root 1.10 const char *const spellpathnames[NRSPELLPATHS] = {
112     "Protection",
113     "Fire",
114     "Frost",
115     "Electricity",
116     "Missiles",
117     "Self",
118     "Summoning",
119     "Abjuration",
120     "Restoration",
121     "Detonation",
122     "Mind",
123     "Creation",
124     "Teleportation",
125     "Information",
126     "Transmutation",
127     "Transferrence",
128     "Turning",
129     "Wounding",
130     "Death",
131     "Light"
132 elmex 1.1 };
133    
134 pippijn 1.21 /* init_environ initialises values from the environmental variables.
135 elmex 1.1 * it needs to be called very early, since command line options should
136     * overwrite these if specified.
137     */
138 root 1.10 void
139 root 1.52 init_environ ()
140 root 1.10 {
141 root 1.46 const char *cp;
142 elmex 1.1
143 root 1.47 if (cp = getenv ("DELIANTRA_CONFDIR" )) settings.confdir = cp;
144 root 1.46 if (cp = getenv ("DELIANTRA_LIBDIR" )) settings.datadir = cp;
145     if (cp = getenv ("DELIANTRA_LOCALDIR" )) settings.localdir = cp;
146     if (cp = getenv ("DELIANTRA_PLAYERDIR" )) settings.playerdir = cp;
147     if (cp = getenv ("DELIANTRA_MAPDIR" )) settings.mapdir = cp;
148     if (cp = getenv ("DELIANTRA_ARCHETYPES" )) settings.archetypes = cp;
149     if (cp = getenv ("DELIANTRA_TREASURES" )) settings.treasures = cp;
150     if (cp = getenv ("DELIANTRA_UNIQUEDIR" )) settings.uniquedir = cp;
151     if (cp = getenv ("DELIANTRA_TEMPLATEDIR")) settings.templatedir = cp;
152     if (cp = getenv ("DELIANTRA_TMPDIR" )) settings.tmpdir = cp;
153    
154     if (cp = getenv ("DELIANTRA_LOGFILE" )) settings.logfilename = cp;
155 elmex 1.1 }
156 root 1.10
157 elmex 1.1 /*
158     * Initialises all global variables.
159     * Might use environment-variables as default for some of them.
160     */
161 root 1.10 void
162 root 1.52 init_globals ()
163 root 1.10 {
164     if (settings.logfilename[0] == 0)
165 root 1.56 log_setfd (-1);
166 root 1.44 else
167 root 1.10 {
168 root 1.44 int logfd = open (settings.logfilename, O_CREAT|O_WRONLY|O_APPEND, 0666);
169    
170     if (logfd >= 0)
171 root 1.56 log_setfd (logfd);
172 root 1.44 else
173     {
174 root 1.56 log_setfd (-1);
175 root 1.44 LOG (llevError, "Unable to open %s as the logfile - will use stderr instead", settings.logfilename);
176     }
177 elmex 1.1 }
178     }
179    
180 root 1.10 void
181 root 1.52 init_dynamic ()
182 root 1.10 {
183 root 1.39 first_map_ext_path = "/start/HallsOfSelection";
184     first_map_path = "/HallOfSelection";
185 elmex 1.1 }
186    
187     /*
188 pippijn 1.21 * initialises the attack messages.
189 elmex 1.1 * Called by init_library().
190     */
191    
192     //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS];
193    
194 root 1.10 void
195 root 1.52 init_attackmess ()
196 root 1.10 {
197 root 1.58 object_thawer thawer (settings.datadir, "attackmess");
198 root 1.57
199     if (!thawer)
200 root 1.10 {
201 root 1.58 LOG (llevError, "Can't open %s.\n", thawer.name);
202 root 1.10 return;
203 elmex 1.1 }
204    
205 root 1.57 int msgnum = -1;
206     int total = 0;
207    
208     while (thawer.kw)
209 root 1.10 {
210 root 1.57 if (thawer.kw != KW_type)
211     if (!thawer.parse_error ("attackmess file"))
212     break;
213 root 1.45
214 root 1.57 thawer.get (msgnum);
215     thawer.next ();
216 root 1.45
217 root 1.57 int level = 0;
218 root 1.10
219 root 1.57 while (thawer.kw == KW_hp)
220 root 1.10 {
221 root 1.57 // our old friend, dog-slow sscanf
222     int hp;
223     char buf1[1024];
224     char buf2[1024];
225     char buf3[1024];
226    
227     if (4 != sscanf (thawer.value_nn, "%d %1023[^|]|%1023[^|]|%1023[^|]",
228     &hp, buf1, buf2, buf3))
229     thawer.parse_error ("attackmess file");
230     else
231 root 1.10 {
232 root 1.57 if (*buf2 == '-')
233     *buf2 = 0; // sscanf can't parse empty fields, so use "-" as marker
234 root 1.45
235 root 1.57 attack_mess[msgnum][level].level = hp;
236     attack_mess[msgnum][level].buf1 = strdup (buf1);
237     attack_mess[msgnum][level].buf2 = strdup (buf2);
238     attack_mess[msgnum][level].buf3 = strdup (buf3);
239 root 1.51
240 root 1.57 ++level;
241     ++total;
242     }
243 root 1.51
244 root 1.57 thawer.next ();
245 root 1.10 }
246 root 1.51
247 root 1.57 attack_mess[msgnum][level].level = -1;
248     attack_mess[msgnum][level].buf1 = 0;
249     attack_mess[msgnum][level].buf2 = 0;
250     attack_mess[msgnum][level].buf3 = 0;
251 elmex 1.1 }
252 root 1.45
253 root 1.51 LOG (llevDebug, "got %d messages in %d categories.\n", total, msgnum + 1);
254 elmex 1.1 }
255 root 1.45