--- deliantra/server/include/util.h 2007/01/15 00:40:49 1.27 +++ deliantra/server/include/util.h 2007/01/15 02:39:41 1.31 @@ -8,6 +8,7 @@ #endif #include +#include #include #include @@ -34,6 +35,48 @@ #define IN_RANGE_EXC(val,beg,end) \ ((unsigned int)(val) - (unsigned int)(beg) < (unsigned int)(end) - (unsigned int)(beg)) +void fork_abort (const char *msg); + +// this is much faster than crossfires original algorithm +// on modern cpus +inline int +isqrt (int n) +{ + return (int)sqrtf ((float)n); +} + +// this is only twice as fast as naive sqrtf (dx*dy+dy*dy) +#if 0 +// and has a max. error of 6 in the range -100..+100. +#else +// and has a max. error of 9 in the range -100..+100. +#endif +inline int +idistance (int dx, int dy) +{ + unsigned int dx_ = abs (dx); + unsigned int dy_ = abs (dy); + +#if 0 + return dx_ > dy_ + ? (dx_ * 61685 + dy_ * 26870) >> 16 + : (dy_ * 61685 + dx_ * 26870) >> 16; +#else + return dx_ + dy_ - min (dx_, dy_) * 5 / 8; +#endif +} + +/* + * absdir(int): Returns a number between 1 and 8, which represent + * the "absolute" direction of a number (it actually takes care of + * "overflow" in previous calculations of a direction). + */ +inline int +absdir (int d) +{ + return ((d - 1) & 7) + 1; +} + // makes dynamically allocated objects zero-initialised struct zero_initialised {