// Evol functions. // Authors: // 4144 // Reid // Description: // Math functions // abs() // returns the absolute value of the passed integer function script abs { .@n = getarg(0); return .@n >= 0 ? .@n : -.@n; } // lognbaselvl({{, }}) // returns BaseLevel * logn (BaseLevel * alpha). function script lognbaselvl { .@alpha = getarg(0, 1); .@min = getarg(1, 1); .@ret = 0; .@pc_level = BaseLevel * .@alpha; while (.@pc_level >>= 1) { ++.@ret; } .@ret *= BaseLevel; if (.@ret <= .@min) { .@ret = .@min; } return .@ret; } // log2() // returns the base 2 logarithm of the passed integer // Note: Negative values are first converted to positive. // For 0, -1 is returned instead // (as if passed value == 0.5, but that is not possible for integers). function script log2 { .@v = abs(getarg(0)); .@i = -1; while (.@v > 0) { .@i += 1; .@v >>= 1; } return .@i; } // result is: lower < target <= higher // is_between ( lower, higher, target) function script is_between { .@val=getarg(2); .@min=getarg(0); .@max=getarg(1); return (.@min < .@val && .@val <= .@max); } // result is: lower < target <= higher // is_between ( lower, target, higher) function script is_between2 { .@min=getarg(0); .@val=getarg(1); .@max=getarg(2); return (.@min < .@val && .@val <= .@max); } // forces the equation: lower <= target <= higher. // Note it still works if higher and target values are swapped. // limit ( lower, target, higher) function script limit { return max(getarg(0), min(getarg(1), getarg(2))); } // result is the ponderate average. // ponderate_avg ( arg1, sub1, arg2, sub2) function script ponderate_avg { .@a1=getarg(0); .@s1=getarg(1); .@a2=getarg(2); .@s2=getarg(3); .@h1=.@a1*.@s1; .@h2=.@a2*.@s2; .@dd=.@s1+.@s2; return (.@h1+.@h2)/.@dd; }