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.14 by root, Thu Sep 14 01:34:41 2006 UTC vs.
Revision 1.34 by root, Mon Jan 1 12:28:46 2007 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines