… | |
… | |
31 | * information, having it here probably makes more sense. |
31 | * information, having it here probably makes more sense. |
32 | */ |
32 | */ |
33 | void |
33 | void |
34 | load_settings () |
34 | load_settings () |
35 | { |
35 | { |
36 | char buf[MAX_BUF], *cp; |
36 | char fname [1024]; |
37 | int has_val, comp; |
|
|
38 | FILE *fp; |
|
|
39 | |
|
|
40 | sprintf (buf, "%s/settings", settings.confdir); |
37 | sprintf (fname, "%s/settings", settings.confdir); |
|
|
38 | object_thawer thawer (fname); |
41 | |
39 | |
42 | /* We don't require a settings file at current time, but down the road, |
40 | if (!thawer) |
43 | * there will probably be so many values that not having a settings file |
|
|
44 | * will not be a good thing. |
|
|
45 | */ |
|
|
46 | if (!(fp = open_and_uncompress (buf, 0, &comp))) |
|
|
47 | { |
41 | { |
48 | LOG (llevError, "Error: No settings file found\n"); |
42 | LOG (llevError, "Error: No settings file found\n"); |
49 | exit (1); |
43 | exit (1); |
50 | } |
44 | } |
51 | |
45 | |
52 | while (fgets (buf, MAX_BUF - 1, fp) != NULL) |
46 | while (thawer.kw) |
53 | { |
47 | { |
54 | if (buf[0] == '#') |
48 | const char *buf = thawer.kw_str; |
55 | continue; |
49 | const char *cp = thawer.value_nn; |
56 | /* eliminate newline */ |
|
|
57 | if ((cp = strrchr (buf, '\n')) != NULL) |
|
|
58 | *cp = '\0'; |
|
|
59 | |
50 | |
60 | /* Skip over empty lines */ |
|
|
61 | if (buf[0] == 0) |
|
|
62 | continue; |
|
|
63 | |
|
|
64 | /* Skip all the spaces and set them to nulls. If not space, |
|
|
65 | * set cp to "" to make strcpy's and the like easier down below. |
|
|
66 | */ |
|
|
67 | if ((cp = strchr (buf, ' ')) != NULL) |
|
|
68 | { |
|
|
69 | while (*cp == ' ') |
|
|
70 | *cp++ = 0; |
|
|
71 | has_val = 1; |
|
|
72 | } |
|
|
73 | else |
|
|
74 | { |
|
|
75 | cp = (char *)""; |
|
|
76 | has_val = 0; |
|
|
77 | } |
|
|
78 | |
|
|
79 | if (!strcasecmp (buf, "not_permadeth")) |
51 | if (!strcmp (buf, "not_permadeth")) |
80 | { |
52 | { |
81 | if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) |
53 | if (!strcmp (cp, "on") || !strcmp (cp, "true")) |
82 | { |
54 | { |
83 | settings.not_permadeth = TRUE; |
55 | settings.not_permadeth = TRUE; |
84 | } |
56 | } |
85 | else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false")) |
57 | else if (!strcmp (cp, "off") || !strcmp (cp, "false")) |
86 | { |
58 | { |
87 | settings.not_permadeth = FALSE; |
59 | settings.not_permadeth = FALSE; |
88 | } |
60 | } |
89 | else |
61 | else |
90 | { |
62 | { |
91 | LOG (llevError, "load_settings: Unknown value for not_permadeth" ": %s\n", cp); |
63 | LOG (llevError, "load_settings: Unknown value for not_permadeth" ": %s\n", cp); |
92 | } |
64 | } |
93 | } |
65 | } |
94 | else if (!strcasecmp (buf, "resurrection")) |
66 | else if (!strcmp (buf, "resurrection")) |
95 | { |
67 | { |
96 | if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) |
68 | if (!strcmp (cp, "on") || !strcmp (cp, "true")) |
97 | { |
69 | { |
98 | settings.resurrection = TRUE; |
70 | settings.resurrection = TRUE; |
99 | } |
71 | } |
100 | else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false")) |
72 | else if (!strcmp (cp, "off") || !strcmp (cp, "false")) |
101 | { |
73 | { |
102 | settings.resurrection = FALSE; |
74 | settings.resurrection = FALSE; |
103 | } |
75 | } |
104 | else |
76 | else |
105 | { |
77 | { |
106 | LOG (llevError, "load_settings: Unknown value for resurrection" ": %s\n", cp); |
78 | LOG (llevError, "load_settings: Unknown value for resurrection" ": %s\n", cp); |
107 | } |
79 | } |
108 | } |
80 | } |
109 | else if (!strcasecmp (buf, "set_title")) |
81 | else if (!strcmp (buf, "set_title")) |
110 | { |
82 | { |
111 | if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) |
83 | if (!strcmp (cp, "on") || !strcmp (cp, "true")) |
112 | { |
84 | { |
113 | settings.set_title = TRUE; |
85 | settings.set_title = TRUE; |
114 | } |
86 | } |
115 | else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false")) |
87 | else if (!strcmp (cp, "off") || !strcmp (cp, "false")) |
116 | { |
88 | { |
117 | settings.set_title = FALSE; |
89 | settings.set_title = FALSE; |
118 | } |
90 | } |
119 | else |
91 | else |
120 | { |
92 | { |
121 | LOG (llevError, "load_settings: Unknown value for set_title" ": %s\n", cp); |
93 | LOG (llevError, "load_settings: Unknown value for set_title" ": %s\n", cp); |
122 | } |
94 | } |
123 | } |
95 | } |
124 | else if (!strcasecmp (buf, "search_items")) |
96 | else if (!strcmp (buf, "search_items")) |
125 | { |
97 | { |
126 | if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) |
98 | if (!strcmp (cp, "on") || !strcmp (cp, "true")) |
127 | { |
99 | { |
128 | settings.search_items = TRUE; |
100 | settings.search_items = TRUE; |
129 | } |
101 | } |
130 | else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false")) |
102 | else if (!strcmp (cp, "off") || !strcmp (cp, "false")) |
131 | { |
103 | { |
132 | settings.search_items = FALSE; |
104 | settings.search_items = FALSE; |
133 | } |
105 | } |
134 | else |
106 | else |
135 | { |
107 | { |
136 | LOG (llevError, "load_settings: Unknown value for search_items" ": %s\n", cp); |
108 | LOG (llevError, "load_settings: Unknown value for search_items" ": %s\n", cp); |
137 | } |
109 | } |
138 | } |
110 | } |
139 | else if (!strcasecmp (buf, "spell_encumbrance")) |
111 | else if (!strcmp (buf, "spell_encumbrance")) |
140 | { |
112 | { |
141 | if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) |
113 | if (!strcmp (cp, "on") || !strcmp (cp, "true")) |
142 | { |
114 | { |
143 | settings.spell_encumbrance = TRUE; |
115 | settings.spell_encumbrance = TRUE; |
144 | } |
116 | } |
145 | else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false")) |
117 | else if (!strcmp (cp, "off") || !strcmp (cp, "false")) |
146 | { |
118 | { |
147 | settings.spell_encumbrance = FALSE; |
119 | settings.spell_encumbrance = FALSE; |
148 | } |
120 | } |
149 | else |
121 | else |
150 | { |
122 | { |
151 | LOG (llevError, "load_settings: Unknown value for " "spell_encumbrance: %s\n", cp); |
123 | LOG (llevError, "load_settings: Unknown value for " "spell_encumbrance: %s\n", cp); |
152 | } |
124 | } |
153 | } |
125 | } |
154 | else if (!strcasecmp (buf, "spell_failure_effects")) |
126 | else if (!strcmp (buf, "spell_failure_effects")) |
155 | { |
127 | { |
156 | if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) |
128 | if (!strcmp (cp, "on") || !strcmp (cp, "true")) |
157 | { |
129 | { |
158 | settings.spell_failure_effects = TRUE; |
130 | settings.spell_failure_effects = TRUE; |
159 | } |
131 | } |
160 | else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false")) |
132 | else if (!strcmp (cp, "off") || !strcmp (cp, "false")) |
161 | { |
133 | { |
162 | settings.spell_failure_effects = FALSE; |
134 | settings.spell_failure_effects = FALSE; |
163 | } |
135 | } |
164 | else |
136 | else |
165 | { |
137 | { |
166 | LOG (llevError, "load_settings: Unknown value for " "spell_failure_effects: %s\n", cp); |
138 | LOG (llevError, "load_settings: Unknown value for " "spell_failure_effects: %s\n", cp); |
167 | } |
139 | } |
168 | } |
140 | } |
169 | else if (!strcasecmp (buf, "spellpoint_level_depend")) |
141 | else if (!strcmp (buf, "spellpoint_level_depend")) |
170 | { |
142 | { |
171 | if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) |
143 | if (!strcmp (cp, "on") || !strcmp (cp, "true")) |
172 | { |
144 | { |
173 | settings.spellpoint_level_depend = TRUE; |
145 | settings.spellpoint_level_depend = TRUE; |
174 | } |
146 | } |
175 | else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false")) |
147 | else if (!strcmp (cp, "off") || !strcmp (cp, "false")) |
176 | { |
148 | { |
177 | settings.spellpoint_level_depend = FALSE; |
149 | settings.spellpoint_level_depend = FALSE; |
178 | } |
150 | } |
179 | else |
151 | else |
180 | { |
152 | { |
181 | LOG (llevError, "load_settings: Unknown value for " "spellpoint_level_depend: %s\n", cp); |
153 | LOG (llevError, "load_settings: Unknown value for " "spellpoint_level_depend: %s\n", cp); |
182 | } |
154 | } |
183 | } |
155 | } |
184 | else if (!strcasecmp (buf, "stat_loss_on_death")) |
156 | else if (!strcmp (buf, "stat_loss_on_death")) |
185 | { |
157 | { |
186 | if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) |
158 | if (!strcmp (cp, "on") || !strcmp (cp, "true")) |
187 | { |
159 | { |
188 | settings.stat_loss_on_death = TRUE; |
160 | settings.stat_loss_on_death = TRUE; |
189 | } |
161 | } |
190 | else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false")) |
162 | else if (!strcmp (cp, "off") || !strcmp (cp, "false")) |
191 | { |
163 | { |
192 | settings.stat_loss_on_death = FALSE; |
164 | settings.stat_loss_on_death = FALSE; |
193 | } |
165 | } |
194 | else |
166 | else |
195 | { |
167 | { |
196 | LOG (llevError, "load_settings: Unknown value for " "stat_loss_on_death: %s\n", cp); |
168 | LOG (llevError, "load_settings: Unknown value for " "stat_loss_on_death: %s\n", cp); |
197 | } |
169 | } |
198 | } |
170 | } |
199 | else if (!strcasecmp (buf, "use_permanent_experience")) |
171 | else if (!strcmp (buf, "use_permanent_experience")) |
200 | { |
172 | { |
201 | LOG (llevError, "use_permanent_experience is deprecated, use" "permenent_experience_percentage instead\n"); |
173 | LOG (llevError, "use_permanent_experience is deprecated, use" "permenent_experience_percentage instead\n"); |
202 | } |
174 | } |
203 | else if (!strcasecmp (buf, "permanent_experience_percentage")) |
175 | else if (!strcmp (buf, "permanent_experience_percentage")) |
204 | { |
176 | { |
205 | int val = atoi (cp); |
177 | int val = atoi (cp); |
206 | |
178 | |
207 | if (val < 0 || val > 100) |
179 | if (val < 0 || val > 100) |
208 | LOG (llevError, "load_settings: permenent_experience_percentage" "must be between 0 and 100, %d is invalid\n", val); |
180 | LOG (llevError, "load_settings: permenent_experience_percentage" "must be between 0 and 100, %d is invalid\n", val); |
209 | else |
181 | else |
210 | settings.permanent_exp_ratio = val; |
182 | settings.permanent_exp_ratio = val; |
211 | } |
183 | } |
212 | else if (!strcasecmp (buf, "death_penalty_percentage")) |
184 | else if (!strcmp (buf, "death_penalty_percentage")) |
213 | { |
185 | { |
214 | int val = atoi (cp); |
186 | int val = atoi (cp); |
215 | |
187 | |
216 | if (val < 0 || val > 100) |
188 | if (val < 0 || val > 100) |
217 | LOG (llevError, "load_settings: death_penalty_percentage" "must be between 0 and 100, %d is invalid\n", val); |
189 | LOG (llevError, "load_settings: death_penalty_percentage" "must be between 0 and 100, %d is invalid\n", val); |
218 | else |
190 | else |
219 | settings.death_penalty_ratio = val; |
191 | settings.death_penalty_ratio = val; |
220 | } |
192 | } |
221 | else if (!strcasecmp (buf, "death_penalty_levels")) |
193 | else if (!strcmp (buf, "death_penalty_levels")) |
222 | { |
194 | { |
223 | int val = atoi (cp); |
195 | int val = atoi (cp); |
224 | |
196 | |
225 | if (val < 0 || val > 255) |
197 | if (val < 0 || val > 255) |
226 | LOG (llevError, "load_settings: death_penalty_levels" "can not be negative, %d is invalid\n", val); |
198 | LOG (llevError, "load_settings: death_penalty_levels" "can not be negative, %d is invalid\n", val); |
227 | else |
199 | else |
228 | settings.death_penalty_level = val; |
200 | settings.death_penalty_level = val; |
229 | } |
201 | } |
230 | else if (!strcasecmp (buf, "balanced_stat_loss")) |
202 | else if (!strcmp (buf, "balanced_stat_loss")) |
231 | { |
203 | { |
232 | if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) |
204 | if (!strcmp (cp, "on") || !strcmp (cp, "true")) |
233 | { |
205 | { |
234 | settings.balanced_stat_loss = TRUE; |
206 | settings.balanced_stat_loss = TRUE; |
235 | } |
207 | } |
236 | else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false")) |
208 | else if (!strcmp (cp, "off") || !strcmp (cp, "false")) |
237 | { |
209 | { |
238 | settings.balanced_stat_loss = FALSE; |
210 | settings.balanced_stat_loss = FALSE; |
239 | } |
211 | } |
240 | else |
212 | else |
241 | { |
213 | { |
242 | LOG (llevError, "load_settings: Unknown value for " "balanced_stat_loss: %s\n", cp); |
214 | LOG (llevError, "load_settings: Unknown value for " "balanced_stat_loss: %s\n", cp); |
243 | } |
215 | } |
244 | } |
216 | } |
245 | else if (!strcasecmp (buf, "simple_exp")) |
217 | else if (!strcmp (buf, "simple_exp")) |
246 | { |
218 | { |
247 | if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) |
219 | if (!strcmp (cp, "on") || !strcmp (cp, "true")) |
248 | { |
220 | { |
249 | settings.simple_exp = TRUE; |
221 | settings.simple_exp = TRUE; |
250 | } |
222 | } |
251 | else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false")) |
223 | else if (!strcmp (cp, "off") || !strcmp (cp, "false")) |
252 | { |
224 | { |
253 | settings.simple_exp = FALSE; |
225 | settings.simple_exp = FALSE; |
254 | } |
226 | } |
255 | else |
227 | else |
256 | { |
228 | { |
257 | LOG (llevError, "load_settings: Unknown value for simple_exp: %s\n", cp); |
229 | LOG (llevError, "load_settings: Unknown value for simple_exp: %s\n", cp); |
258 | } |
230 | } |
259 | } |
231 | } |
260 | else if (!strcasecmp (buf, "item_power_factor")) |
232 | else if (!strcmp (buf, "item_power_factor")) |
261 | { |
233 | { |
262 | float tmp = atof (cp); |
234 | float tmp = atof (cp); |
263 | |
235 | |
264 | if (tmp < 0) |
236 | if (tmp < 0) |
265 | LOG (llevError, "load_settings: item_power_factor must be a positive number (%f < 0)\n", tmp); |
237 | LOG (llevError, "load_settings: item_power_factor must be a positive number (%f < 0)\n", tmp); |
266 | else |
238 | else |
267 | settings.item_power_factor = tmp; |
239 | settings.item_power_factor = tmp; |
268 | } |
240 | } |
269 | else if (!strcasecmp (buf, "pk_luck_penalty")) |
241 | else if (!strcmp (buf, "pk_luck_penalty")) |
270 | { |
242 | { |
271 | sint16 val = atoi (cp); |
243 | sint16 val = atoi (cp); |
272 | |
244 | |
273 | if (val < -100 || val > 100) |
245 | if (val < -100 || val > 100) |
274 | LOG (llevError, "load_settings: pk_luck_penalty must be between -100 and 100" ", %d is invalid\n", val); |
246 | LOG (llevError, "load_settings: pk_luck_penalty must be between -100 and 100" ", %d is invalid\n", val); |
275 | else |
247 | else |
276 | settings.pk_luck_penalty = val; |
248 | settings.pk_luck_penalty = val; |
277 | } |
249 | } |
278 | else if (!strcasecmp (buf, "set_friendly_fire")) |
250 | else if (!strcmp (buf, "set_friendly_fire")) |
279 | { |
251 | { |
280 | int val = atoi (cp); |
252 | int val = atoi (cp); |
281 | |
253 | |
282 | if (val < 0 || val > 100) |
254 | if (val < 0 || val > 100) |
283 | LOG (llevError, "load_settings: set_friendly_fire must be between 0 an 100" ", %d is invalid\n", val); |
255 | LOG (llevError, "load_settings: set_friendly_fire must be between 0 an 100" ", %d is invalid\n", val); |
284 | else |
256 | else |
285 | settings.set_friendly_fire = val; |
257 | settings.set_friendly_fire = val; |
286 | } |
258 | } |
287 | else if (!strcasecmp (buf, "armor_max_enchant")) |
259 | else if (!strcmp (buf, "armor_max_enchant")) |
288 | { |
260 | { |
289 | int max_e = atoi (cp); |
261 | int max_e = atoi (cp); |
290 | |
262 | |
291 | if (max_e <= 0) |
263 | if (max_e <= 0) |
292 | LOG (llevError, "load_settings: armor_max_enchant is %d\n", max_e); |
264 | LOG (llevError, "load_settings: armor_max_enchant is %d\n", max_e); |
293 | else |
265 | else |
294 | settings.armor_max_enchant = max_e; |
266 | settings.armor_max_enchant = max_e; |
295 | } |
267 | } |
296 | else if (!strcasecmp (buf, "armor_weight_reduction")) |
268 | else if (!strcmp (buf, "armor_weight_reduction")) |
297 | { |
269 | { |
298 | int wr = atoi (cp); |
270 | int wr = atoi (cp); |
299 | |
271 | |
300 | if (wr < 0) |
272 | if (wr < 0) |
301 | LOG (llevError, "load_settings: armor_weight_reduction is %d\n", wr); |
273 | LOG (llevError, "load_settings: armor_weight_reduction is %d\n", wr); |
302 | else |
274 | else |
303 | settings.armor_weight_reduction = wr; |
275 | settings.armor_weight_reduction = wr; |
304 | } |
276 | } |
305 | else if (!strcasecmp (buf, "armor_weight_linear")) |
277 | else if (!strcmp (buf, "armor_weight_linear")) |
306 | { |
278 | { |
307 | if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) |
279 | if (!strcmp (cp, "on") || !strcmp (cp, "true")) |
308 | { |
280 | { |
309 | settings.armor_weight_linear = TRUE; |
281 | settings.armor_weight_linear = TRUE; |
310 | } |
282 | } |
311 | else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false")) |
283 | else if (!strcmp (cp, "off") || !strcmp (cp, "false")) |
312 | { |
284 | { |
313 | settings.armor_weight_linear = FALSE; |
285 | settings.armor_weight_linear = FALSE; |
314 | } |
286 | } |
315 | else |
287 | else |
316 | { |
288 | { |
317 | LOG (llevError, "load_settings: unknown value for armor_weight_linear: %s\n", cp); |
289 | LOG (llevError, "load_settings: unknown value for armor_weight_linear: %s\n", cp); |
318 | } |
290 | } |
319 | |
291 | |
320 | } |
292 | } |
321 | else if (!strcasecmp (buf, "armor_speed_improvement")) |
293 | else if (!strcmp (buf, "armor_speed_improvement")) |
322 | { |
294 | { |
323 | int wr = atoi (cp); |
295 | int wr = atoi (cp); |
324 | |
296 | |
325 | if (wr < 0) |
297 | if (wr < 0) |
326 | LOG (llevError, "load_settings: armor_speed_improvement is %d\n", wr); |
298 | LOG (llevError, "load_settings: armor_speed_improvement is %d\n", wr); |
327 | else |
299 | else |
328 | settings.armor_speed_improvement = wr; |
300 | settings.armor_speed_improvement = wr; |
329 | } |
301 | } |
330 | else if (!strcasecmp (buf, "armor_speed_linear")) |
302 | else if (!strcmp (buf, "armor_speed_linear")) |
331 | { |
303 | { |
332 | if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) |
304 | if (!strcmp (cp, "on") || !strcmp (cp, "true")) |
333 | { |
305 | { |
334 | settings.armor_speed_linear = TRUE; |
306 | settings.armor_speed_linear = TRUE; |
335 | } |
307 | } |
336 | else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false")) |
308 | else if (!strcmp (cp, "off") || !strcmp (cp, "false")) |
337 | { |
309 | { |
338 | settings.armor_speed_linear = FALSE; |
310 | settings.armor_speed_linear = FALSE; |
339 | } |
311 | } |
340 | else |
312 | else |
341 | { |
313 | { |
342 | LOG (llevError, "load_settings: unknown value for armor_speed_linear: %s\n", cp); |
314 | LOG (llevError, "load_settings: unknown value for armor_speed_linear: %s\n", cp); |
343 | } |
315 | } |
344 | |
316 | |
345 | } |
317 | } |
346 | else |
318 | else |
347 | LOG (llevError, "Unknown value in settings file: %s\n", buf); |
319 | thawer.parse_error ("settings file"); |
|
|
320 | |
|
|
321 | thawer.next (); |
348 | } |
322 | } |
349 | |
|
|
350 | close_and_delete (fp, comp); |
|
|
351 | } |
323 | } |
352 | |
324 | |
353 | /* |
325 | /* |
354 | * init() is called only once, when starting the program. |
326 | * init() is called only once, when starting the program. |
355 | */ |
327 | */ |