ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/utils.C
(Generate patch)

Comparing deliantra/server/common/utils.C (file contents):
Revision 1.13 by root, Tue Sep 12 21:10:31 2006 UTC vs.
Revision 1.36 by pippijn, Sat Jan 6 14:42:29 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
3 3
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
6 7
7 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
16 17
17 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
18 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 21
21 The authors can be reached via e-mail at crossfire-devel@real-time.com 22 The authors can be reached via e-mail at <crossfire@schmorp.de>
22*/ 23*/
23 24
24/* 25/*
25 * General convenience functions for crossfire. 26 * General convenience functions for crossfire.
26 */ 27 */
27 28
28#include <global.h> 29#include <global.h>
29#include <funcpoint.h> 30#include <funcpoint.h>
30#include <material.h> 31#include <material.h>
31 32
33#include <sys/time.h>
34#include <time.h>
32#include <glib.h> 35#include <glib.h>
33 36
34/* 37/*
35 * The random functions here take luck into account when rolling random 38 * The random functions here take luck into account when rolling random
36 * dice or numbers. This function has less of an impact the larger the 39 * dice or numbers. This function has less of an impact the larger the
97 diff = max - min + 1; 100 diff = max - min + 1;
98 ((diff > 2) ? (base = 20) : (base = 50)); /* d2 and d3 are corner cases */ 101 ((diff > 2) ? (base = 20) : (base = 50)); /* d2 and d3 are corner cases */
99 102
100 if (max < 1 || diff < 1) 103 if (max < 1 || diff < 1)
101 { 104 {
102#ifndef WIN32
103 LOG (llevError, "Calling random_roll with min=%lld max=%lld\n", min, max);
104#else
105 LOG (llevError, "Calling random_roll with min=%I64d max=%I64d\n", min, max); 105 LOG (llevError, "Calling random_roll with min=%" PRId64 " max=%" PRId64 "\n", min, max);
106#endif
107 return (min); /* avoids a float exception */ 106 return (min); /* avoids a float exception */
108 } 107 }
109 108
110 /* Don't know of a portable call to get 64 bit random values. 109 /* Don't know of a portable call to get 64 bit random values.
111 * So make a call to get two 32 bit random numbers, and just to 110 * So make a call to get two 32 bit random numbers, and just to
197 return (min); 196 return (min);
198 197
199 return (RANDOM () % diff + min); 198 return (RANDOM () % diff + min);
200} 199}
201 200
202/* decay and destroy persihable items in a map */ 201/* decay and destroy perishable items in a map */
203
204void 202void
205decay_objects (mapstruct *m) 203maptile::decay_objects ()
206{ 204{
207 int x, y, destroy; 205 if (!spaces)
208 object *op, *otmp;
209
210 if (m->unique)
211 return; 206 return;
212 207
213 for (x = 0; x < MAP_WIDTH (m); x++) 208 for (mapspace *ms = spaces + size (); ms-- > spaces; )
214 for (y = 0; y < MAP_HEIGHT (m); y++) 209 for (object *above, *op = ms->bot; op; op = above)
215 for (op = get_map_ob (m, x, y); op; op = otmp)
216 { 210 {
211 above = op->above;
212
217 destroy = 0; 213 bool destroy = 0;
218 otmp = op->above; 214
215 // do not decay anything above unique floor tiles (yet :)
219 if (QUERY_FLAG (op, FLAG_IS_FLOOR) && QUERY_FLAG (op, FLAG_UNIQUE)) 216 if (QUERY_FLAG (op, FLAG_IS_FLOOR) && QUERY_FLAG (op, FLAG_UNIQUE))
220 break; 217 break;
218
221 if (QUERY_FLAG (op, FLAG_IS_FLOOR) || 219 if (QUERY_FLAG (op, FLAG_IS_FLOOR)
222 QUERY_FLAG (op, FLAG_OBJ_ORIGINAL) || 220 || QUERY_FLAG (op, FLAG_OBJ_ORIGINAL)
223 QUERY_FLAG (op, FLAG_OBJ_SAVE_ON_OVL) || 221 || QUERY_FLAG (op, FLAG_OBJ_SAVE_ON_OVL)
224 QUERY_FLAG (op, FLAG_UNIQUE) || QUERY_FLAG (op, FLAG_OVERLAY_FLOOR) || QUERY_FLAG (op, FLAG_UNPAID) || IS_LIVE (op)) 222 || QUERY_FLAG (op, FLAG_UNIQUE)
225 continue; 223 || QUERY_FLAG (op, FLAG_OVERLAY_FLOOR)
226 /* otherwise, we decay and destroy */ 224 || QUERY_FLAG (op, FLAG_UNPAID)
227 if (IS_WEAPON (op)) 225 || op->is_alive ())
226 ; // do not decay
227 else if (op->is_weapon ())
228 { 228 {
229 op->stats.dam--; 229 op->stats.dam--;
230 if (op->stats.dam < 0) 230 if (op->stats.dam < 0)
231 destroy = 1; 231 destroy = 1;
232 } 232 }
233 else if (IS_ARMOR (op)) 233 else if (op->is_armor ())
234 { 234 {
235 op->stats.ac--; 235 op->stats.ac--;
236 if (op->stats.ac < 0) 236 if (op->stats.ac < 0)
237 destroy = 1; 237 destroy = 1;
238 } 238 }
239 else if (op->type == FOOD) 239 else if (op->type == FOOD)
240 { 240 {
241 op->stats.food -= rndm (5, 20); 241 op->stats.food -= rndm (5, 20);
242 if (op->stats.food < 0) 242 if (op->stats.food < 0)
243 destroy = 1; 243 destroy = 1;
244 } 244 }
245 else 245 else
246 { 246 {
247 if (op->material & M_PAPER || op->material & M_LEATHER || 247 int mat = op->material;
248 op->material & M_WOOD || op->material & M_ORGANIC || op->material & M_CLOTH || op->material & M_LIQUID) 248
249 if (mat & M_PAPER
250 || mat & M_LEATHER
251 || mat & M_WOOD
252 || mat & M_ORGANIC
253 || mat & M_CLOTH
254 || mat & M_LIQUID
255 || (mat & M_IRON && rndm (1, 5) == 1)
256 || (mat & M_GLASS && rndm (1, 2) == 1)
257 || ((mat & M_STONE || mat & M_ADAMANT) && rndm (1, 10) == 1)
258 || ((mat & M_SOFT_METAL || mat & M_BONE) && rndm (1, 3) == 1)
259 || (mat & M_ICE && temp > 32))
249 destroy = 1; 260 destroy = 1;
250 if (op->material & M_IRON && rndm (1, 5) == 1)
251 destroy = 1;
252 if (op->material & M_GLASS && rndm (1, 2) == 1)
253 destroy = 1;
254 if ((op->material & M_STONE || op->material & M_ADAMANT) && rndm (1, 10) == 1)
255 destroy = 1;
256 if ((op->material & M_SOFT_METAL || op->material & M_BONE) && rndm (1, 3) == 1)
257 destroy = 1;
258 if (op->material & M_ICE && MAP_TEMP (m) > 32)
259 destroy = 1;
260 } 261 }
262
261 /* adjust overall chance below */ 263 /* adjust overall chance below */
262 if (destroy && rndm (0, 1)) 264 if (destroy && rndm (0, 1))
263 { 265 op->destroy ();
264 remove_ob (op);
265 free_object (op);
266 }
267 } 266 }
268} 267}
269 268
270/* convert materialname to materialtype_t */ 269/* convert materialname to materialtype_t */
271 270
272materialtype_t * 271materialtype_t *
300 return; 299 return;
301 300
302 if (change->materialname != NULL && strcmp (op->materialname, change->materialname)) 301 if (change->materialname != NULL && strcmp (op->materialname, change->materialname))
303 return; 302 return;
304 303
305 if (!IS_ARMOR (op)) 304 if (!op->is_armor ())
306 return; 305 return;
307 306
308 mt = name_to_material (op->materialname); 307 mt = name_to_material (op->materialname);
309 if (!mt) 308 if (!mt)
310 { 309 {
356 { 355 {
357 if (op->material & mt->material && rndm (1, 100) <= mt->chance && 356 if (op->material & mt->material && rndm (1, 100) <= mt->chance &&
358 difficulty >= mt->difficulty && (op->magic >= mt->magic || mt->magic == 0)) 357 difficulty >= mt->difficulty && (op->magic >= mt->magic || mt->magic == 0))
359 { 358 {
360 lmt = mt; 359 lmt = mt;
361 if (!(IS_WEAPON (op) || IS_ARMOR (op))) 360 if (!(op->is_weapon () || op->is_armor ()))
362 break; 361 break;
363 } 362 }
364 } 363 }
365#endif 364#endif
366 } 365 }
374#ifndef NEW_MATERIAL_CODE 373#ifndef NEW_MATERIAL_CODE
375 op->materialname = lmt->name; 374 op->materialname = lmt->name;
376 return; 375 return;
377#else 376#else
378 377
379 if (op->stats.dam && IS_WEAPON (op)) 378 if (op->stats.dam && op->is_weapon ())
380 { 379 {
381 op->stats.dam += lmt->damage; 380 op->stats.dam += lmt->damage;
382 if (op->stats.dam < 1) 381 if (op->stats.dam < 1)
383 op->stats.dam = 1; 382 op->stats.dam = 1;
384 } 383 }
385 if (op->stats.sp && op->type == BOW) 384 if (op->stats.sp && op->type == BOW)
386 op->stats.sp += lmt->sp; 385 op->stats.sp += lmt->sp;
387 if (op->stats.wc && IS_WEAPON (op)) 386 if (op->stats.wc && op->is_weapon ())
388 op->stats.wc += lmt->wc; 387 op->stats.wc += lmt->wc;
389 if (IS_ARMOR (op)) 388 if (op->is_armor ())
390 { 389 {
391 if (op->stats.ac) 390 if (op->stats.ac)
392 op->stats.ac += lmt->ac; 391 op->stats.ac += lmt->ac;
393 for (j = 0; j < NROFATTACKS; j++) 392 for (j = 0; j < NROFATTACKS; j++)
394 if (op->resist[j] != 0) 393 if (op->resist[j] != 0)
400 op->resist[j] = -100; 399 op->resist[j] = -100;
401 } 400 }
402 } 401 }
403 op->materialname = add_string (lmt->name); 402 op->materialname = add_string (lmt->name);
404 /* dont make it unstackable if it doesn't need to be */ 403 /* dont make it unstackable if it doesn't need to be */
405 if (IS_WEAPON (op) || IS_ARMOR (op)) 404 if (op->is_weapon () || op->is_armor ())
406 { 405 {
407 op->weight = (op->weight * lmt->weight) / 100; 406 op->weight = (op->weight * lmt->weight) / 100;
408 op->value = (op->value * lmt->value) / 100; 407 op->value = (op->value * lmt->value) / 100;
409 } 408 }
410#endif 409#endif
543 strcpy (input, tmp); 542 strcpy (input, tmp);
544 543
545 return; 544 return;
546} 545}
547 546
547/////////////////////////////////////////////////////////////////////////////
548
548void *alloc (int s) throw (std::bad_alloc) 549void *salloc_ (int n) throw (std::bad_alloc)
549{ 550{
550 void *p = g_slice_alloc (s); 551 void *ptr = g_slice_alloc (n);
551 552
552 if (!p) 553 if (!ptr)
553 throw std::bad_alloc (); 554 throw std::bad_alloc ();
554 555
555 return p; 556 return ptr;
557}
558
559void *salloc_ (int n, void *src) throw (std::bad_alloc)
560{
561 void *ptr = salloc_ (n);
562
563 if (src)
564 memcpy (ptr, src, n);
565 else
566 memset (ptr, 0, n);
567
568 return ptr;
556} 569}
557 570
558void assign (char *dst, const char *src, int maxlen) 571void assign (char *dst, const char *src, int maxlen)
559{ 572{
560 if (!src) 573 if (!src)
577 } 590 }
578 else 591 else
579 memcpy (dst, src, len + 1); 592 memcpy (dst, src, len + 1);
580} 593}
581 594
595tstamp now ()
596{
597 struct timeval tv;
598
599 gettimeofday (&tv, 0);
600 return tstamp (tv.tv_sec) + tstamp (tv.tv_usec) * tstamp (1e-6);
601}
602
603int
604similar_direction (int a, int b)
605{
606 if (!a || !b)
607 return 0;
608
609 int diff = (b - a) & 7;
610 return diff <= 1 || diff >= 7;
611}
612

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines