--- deliantra/server/common/compat.C 2010/04/04 04:58:46 1.7 +++ deliantra/server/common/compat.C 2012/01/03 11:25:30 1.15 @@ -1,7 +1,7 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * Copyright (©) 2002 Mark Wedel & Crossfire Development Team * Copyright (©) 1992 Frank Tore Johansen * @@ -36,7 +36,6 @@ #include "define.h" #include "path.h" - /* buf_overflow() - we don't want to exceed the buffer size of * buf1 by adding on buf2! Returns true if overflow will occur. */ @@ -59,26 +58,6 @@ ///////////////////////////////////////////////////////////////////////////// -static const char *const fatalmsgs[80] = { - "Failed to allocate memory", - "Failed repeatedly to load maps", - "Hashtable for archetypes is too small", - "Too many errors" -}; - -/* - * fatal() is meant to be called whenever a fatal signal is intercepted. - * It will call the emergency_save and the clean_tmp_files functions. - */ -void -fatal (const char *msg) -{ - LOG (llevError, "FATAL: %s\n", msg); - cleanup (msg, 1); -} - -///////////////////////////////////////////////////////////////////////////// - /* * The random functions here take luck into account when rolling random * dice or numbers. This function has less of an impact the larger the @@ -95,23 +74,31 @@ * not the recipient (ie, the poor slob getting hit). [garbled 20010916] */ int -random_roll (int r_min, int r_max, const object *op, int goodbad) +random_roll (int r_min, int r_max, const object *op, bool prefer_high) { - r_max = max (r_min, r_max); + if (r_min > r_max) + swap (r_min, r_max); - int base = r_max - r_min > 1 ? 20 : 50; /* d2 and d3 are corner cases */ + int range = r_max - r_min + 1; + int num = rndm (r_min, r_max); - if (op->type == PLAYER) + if (op->stats.luck) { - int luck = op->stats.luck; + int base = range > 2 ? 20 : 50; /* d2 and d3 are corner cases */ - if (rndm (base) < min (10, abs (luck))) + if (rndm (base) < min (10, abs (op->stats.luck))) { - //TODO: take luck into account + // we have a winner, increase/decrease number by one accordingly + int adjust = sign (op->stats.luck); + + if (!prefer_high) + adjust = -adjust; + + num = clamp (num + adjust, r_min, r_max); } } - return rndm (r_min, r_max); + return num; } /* @@ -119,37 +106,37 @@ * for exp loss calculations for players changing religions. */ sint64 -random_roll64 (sint64 r_min, sint64 r_max, const object *op, int goodbad) +random_roll64 (sint64 r_min, sint64 r_max, const object *op, bool prefer_high) { - sint64 omin = r_min; - sint64 range = max (0, r_max - r_min + 1); - int base = range > 2 ? 20 : 50; /* d2 and d3 are corner cases */ + if (r_min > r_max) + swap (r_min, r_max); + sint64 range = r_max - r_min + 1; /* - * Make a call to get two 32 bit unsigned random numbers, and just to + * Make a call to get two 32 bit unsigned random numbers, and just do * a little bitshifting. */ - sint64 ran = (sint64) rndm.next () ^ ((sint64) rndm.next () << 31); - - if (op->type != PLAYER) - return ((ran % range) + r_min); + sint64 num = rndm.next () ^ (sint64 (rndm.next ()) << 31); - int luck = op->stats.luck; + num = num % range + r_min; - if (rndm (base) < min (10, abs (luck))) + if (op->stats.luck) { - /* we have a winner */ - ((luck > 0) ? (luck = 1) : (luck = -1)); - range -= luck; - if (range < 1) - return (omin); /*check again */ + int base = range > 2 ? 20 : 50; /* d2 and d3 are corner cases */ - ((goodbad) ? (r_min += luck) : (range)); + if (rndm (base) < min (10, abs (op->stats.luck))) + { + // we have a winner, increase/decrease number by one accordingly + int adjust = sign (op->stats.luck); - return (max (omin, min (r_max, (ran % range) + r_min))); + if (!prefer_high) + adjust = -adjust; + + num = clamp (num + adjust, r_min, r_max); + } } - return ran % range + r_min; + return num; } /* @@ -160,7 +147,7 @@ * The args are num D size (ie 4d6) [garbled 20010916] */ int -die_roll (int num, int size, const object *op, int goodbad) +die_roll (int num, int size, const object *op, bool prefer_high) { int min_roll, luck, total, i, gotlucky; @@ -171,7 +158,7 @@ if (size < 2 || diff < 1) { - LOG (llevError, "Calling die_roll with num=%d size=%d\n", num, size); + LOG (llevError | logBacktrace, "Calling die_roll with num=%d size=%d\n", num, size); return num; /* avoids a float exception */ } @@ -188,7 +175,7 @@ diff -= luck; if (diff < 1) return (num); /*check again */ - ((goodbad) ? (min_roll += luck) : (diff)); + ((prefer_high) ? (min_roll += luck) : (diff)); total += max (1, min (size, rndm (diff) + min_roll)); } else @@ -316,67 +303,12 @@ return (path); } -/** - * open_and_uncompress() first searches for the original filename. If it exist, - * then it opens it and returns the file-pointer. - */ -FILE * -open_and_uncompress (const char *name, int flag, int *compressed) -{ - *compressed = 0; - return fopen (name, "r"); -} - -/* - * See open_and_uncompress(). - */ - -void -close_and_delete (FILE * fp, int compressed) -{ - fclose (fp); -} - -/* - * Strip out the media tags from a String. - * Warning the input string will contain the result string - */ -void -strip_media_tag (char *message) -{ - int in_tag = 0; - char *dest; - char *src; - - src = dest = message; - while (*src != '\0') - { - if (*src == '[') - { - in_tag = 1; - } - else if (in_tag && (*src == ']')) - in_tag = 0; - else if (!in_tag) - { - *dest = *src; - dest++; - } - src++; - } - *dest = '\0'; -} - #define EOL_SIZE (sizeof("\n")-1) void strip_endline (char *buf) { - if (strlen (buf) < sizeof ("\n")) - { - return; - } - if (!strcmp (buf + strlen (buf) - EOL_SIZE, "\n")) - buf[strlen (buf) - EOL_SIZE] = '\0'; + if (*buf && buf [strlen (buf) - 1] == '\n') + buf [strlen (buf) - 1] = '\0'; } /**