1 | /* |
1 | /* |
2 | * CrossFire, A Multiplayer game |
2 | * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game. |
3 | * |
3 | * |
4 | * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team |
4 | * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team |
5 | * Copyright (C) 2002 Mark Wedel & Crossfire Development Team |
5 | * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team |
6 | * Copyright (C) 1992 Frank Tore Johansen |
6 | * Copyright (©) 1992,2007 Frank Tore Johansen |
7 | * |
7 | * |
8 | * This program is free software; you can redistribute it and/or modify |
8 | * Crossfire TRT is free software; you can redistribute it and/or modify it |
9 | * it under the terms of the GNU General Public License as published by |
9 | * under the terms of the GNU General Public License as published by the Free |
10 | * the Free Software Foundation; either version 2 of the License, or |
10 | * Software Foundation; either version 2 of the License, or (at your option) |
11 | * (at your option) any later version. |
11 | * any later version. |
12 | * |
12 | * |
13 | * This program is distributed in the hope that it will be useful, |
13 | * This program is distributed in the hope that it will be useful, but |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
16 | * GNU General Public License for more details. |
16 | * for more details. |
17 | * |
17 | * |
18 | * You should have received a copy of the GNU General Public License |
18 | * You should have received a copy of the GNU General Public License along |
19 | * along with this program; if not, write to the Free Software |
19 | * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51 |
20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
20 | * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 | * |
21 | * |
22 | * The authors can be reached via e-mail at <crossfire@schmorp.de> |
22 | * The authors can be reached via e-mail to <crossfire@schmorp.de> |
23 | */ |
23 | */ |
24 | |
24 | |
25 | /* |
25 | /* |
26 | * General convenience functions for crossfire. |
26 | * General convenience functions for crossfire. |
27 | */ |
27 | */ |
… | |
… | |
204 | } |
204 | } |
205 | |
205 | |
206 | return total; |
206 | return total; |
207 | } |
207 | } |
208 | |
208 | |
209 | /* decay and destroy perishable items in a map */ |
|
|
210 | void |
|
|
211 | maptile::decay_objects () |
|
|
212 | { |
|
|
213 | if (!spaces) |
|
|
214 | return; |
|
|
215 | |
|
|
216 | for (mapspace *ms = spaces + size (); ms-- > spaces; ) |
|
|
217 | for (object *above, *op = ms->bot; op; op = above) |
|
|
218 | { |
|
|
219 | above = op->above; |
|
|
220 | |
|
|
221 | bool destroy = 0; |
|
|
222 | |
|
|
223 | // do not decay anything above unique floor tiles (yet :) |
|
|
224 | if (QUERY_FLAG (op, FLAG_IS_FLOOR) && QUERY_FLAG (op, FLAG_UNIQUE)) |
|
|
225 | break; |
|
|
226 | |
|
|
227 | if (QUERY_FLAG (op, FLAG_IS_FLOOR) |
|
|
228 | || QUERY_FLAG (op, FLAG_OBJ_ORIGINAL) |
|
|
229 | || QUERY_FLAG (op, FLAG_OBJ_SAVE_ON_OVL) |
|
|
230 | || QUERY_FLAG (op, FLAG_UNIQUE) |
|
|
231 | || QUERY_FLAG (op, FLAG_OVERLAY_FLOOR) |
|
|
232 | || QUERY_FLAG (op, FLAG_UNPAID) |
|
|
233 | || op->is_alive ()) |
|
|
234 | ; // do not decay |
|
|
235 | else if (op->is_weapon ()) |
|
|
236 | { |
|
|
237 | op->stats.dam--; |
|
|
238 | if (op->stats.dam < 0) |
|
|
239 | destroy = 1; |
|
|
240 | } |
|
|
241 | else if (op->is_armor ()) |
|
|
242 | { |
|
|
243 | op->stats.ac--; |
|
|
244 | if (op->stats.ac < 0) |
|
|
245 | destroy = 1; |
|
|
246 | } |
|
|
247 | else if (op->type == FOOD) |
|
|
248 | { |
|
|
249 | op->stats.food -= rndm (5, 20); |
|
|
250 | if (op->stats.food < 0) |
|
|
251 | destroy = 1; |
|
|
252 | } |
|
|
253 | else |
|
|
254 | { |
|
|
255 | int mat = op->materials; |
|
|
256 | |
|
|
257 | if (mat & M_PAPER |
|
|
258 | || mat & M_LEATHER |
|
|
259 | || mat & M_WOOD |
|
|
260 | || mat & M_ORGANIC |
|
|
261 | || mat & M_CLOTH |
|
|
262 | || mat & M_LIQUID |
|
|
263 | || (mat & M_IRON && rndm (1, 5) == 1) |
|
|
264 | || (mat & M_GLASS && rndm (1, 2) == 1) |
|
|
265 | || ((mat & M_STONE || mat & M_ADAMANT) && rndm (1, 10) == 1) |
|
|
266 | || ((mat & M_SOFT_METAL || mat & M_BONE) && rndm (1, 3) == 1) |
|
|
267 | || (mat & M_ICE && temp > 32)) |
|
|
268 | destroy = 1; |
|
|
269 | } |
|
|
270 | |
|
|
271 | /* adjust overall chance below */ |
|
|
272 | if (destroy && rndm (0, 1)) |
|
|
273 | op->destroy (); |
|
|
274 | } |
|
|
275 | } |
|
|
276 | |
|
|
277 | /* convert materialname to materialtype_t */ |
209 | /* convert materialname to materialtype_t */ |
278 | |
210 | |
279 | materialtype_t * |
211 | materialtype_t * |
280 | name_to_material (const shstr &name) |
212 | name_to_material (const shstr &name) |
281 | { |
213 | { |
… | |
… | |
306 | return; |
238 | return; |
307 | |
239 | |
308 | mt = name_to_material (op->materialname); |
240 | mt = name_to_material (op->materialname); |
309 | if (!mt) |
241 | if (!mt) |
310 | { |
242 | { |
311 | LOG (llevError, "archetype '%s>%s' uses nonexistent material '%s'\n", &op->arch->name, &op->name, &op->materialname); |
243 | LOG (llevError, "archetype '%s>%s' uses nonexistent material '%s'\n", &op->arch->archname, &op->name, &op->materialname); |
312 | return; |
244 | return; |
313 | } |
245 | } |
314 | |
246 | |
315 | for (j = 0; j < NROFATTACKS; j++) |
247 | for (j = 0; j < NROFATTACKS; j++) |
316 | if (op->resist[j] == 0 && change->resist[j] != 0) |
248 | if (op->resist[j] == 0 && change->resist[j] != 0) |