diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm new file mode 100644 index 00000000000..a5f8e4625c2 --- /dev/null +++ b/code/__HELPERS/maths.dm @@ -0,0 +1,113 @@ +// Credits to Nickr5 for the useful procs I've taken from his library resource. + + +var/const/Pi = 3.14159265 +var/const/E = 2.71828183 +var/const/Sqrt2 = 1.41421356 + + +/proc/Atan2(x, y) + if(!x && !y) return 0 + var/a = arccos(x / sqrt(x*x + y*y)) + return y >= 0 ? a : -a + +/proc/Ceiling(x) + return -round(-x) + +/proc/Clamp(val, min, max) + return max(min, min(val, max)) + +// cotangent +/proc/Cot(x) + return 1 / Tan(x) + +// cosecant +/proc/Csc(x) + return 1 / sin(x) + +/proc/Default(a, b) + return a ? a : b + +/proc/Floor(x) + return round(x) + +// Greatest Common Divisor - Euclid's algorithm +/proc/Gcd(a, b) + return b ? Gcd(b, a % b) : a + +/proc/Inverse(x) + return 1 / x + +/proc/IsAboutEqual(a, b, deviation = 0.1) + return abs(a - b) <= deviation + +/proc/IsEven(x) + return x % 2 == 0 + +// Returns true if val is from min to max, inclusive. +/proc/IsInRange(val, min, max) + return min <= val && val <= max + +/proc/IsInteger(x) + return Floor(x) == x + +/proc/IsOdd(x) + return !IsEven(x) + +// Least Common Multiple +/proc/Lcm(a, b) + return abs(a) / Gcd(a, b) * abs(b) + +// Performs a linear interpolation between a and b. +// Note that amount=0 returns a, amount=1 returns b, and +// amount=0.5 returns the mean of a and b. +/proc/Lerp(a, b, amount = 0.5) + return a + (b - a) * amount + +/proc/Mean(...) + var/values = 0 + var/sum = 0 + for(var/val in args) + values++ + sum += val + return sum / values + + +// Returns the nth root of x. +/proc/Root(n, x) + return x ** (1 / n) + +// secant +/proc/Sec(x) + return 1 / cos(x) + +// The quadratic formula. Returns a list with the solutions, or an empty list +// if they are imaginary. +/proc/SolveQuadratic(a, b, c) + ASSERT(a) + . = list() + var/d = b*b - 4 * a * c + var/bottom = 2 * a + if(d < 0) return + var/root = sqrt(d) + . += (-b + root) / bottom + if(!d) return + . += (-b - root) / bottom + +// tangent +/proc/Tan(x) + return sin(x) / cos(x) + +/proc/ToDegrees(radians) + // 180 / Pi + return radians * 57.2957795 + +/proc/ToRadians(degrees) + // Pi / 180 + return degrees * 0.0174532925 + +// min is inclusive, max is exclusive +/proc/Wrap(val, min, max) + var/d = max - min + var/t = Floor((val - min) / d) + return val - (t * d) \ No newline at end of file diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index cc8d300f797..1d5fa0d2599 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -30,7 +30,7 @@ /obj/effect/landmark/corpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it. var/mob/living/carbon/human/M = new /mob/living/carbon/human (src.loc) M.real_name = src.name - M.stat = 2 //Kills the new mob + M.death(1) //Kills the new mob if(src.corpseuniform) M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform) if(src.corpsesuit) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index acd9683094c..c3ee17aa105 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -63,8 +63,10 @@ tod = worldtime2text() //weasellos time of death patch if(mind) mind.store_memory("Time of death: [tod]", 0) - sql_report_death(src) - ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now + if(ticker && ticker.mode) + world.log << "k" + sql_report_death(src) + ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now return ..(gibbed) /mob/living/carbon/human/proc/makeSkeleton()