diff --git a/code/__defines/math.dm b/code/__defines/math.dm
index 3d64ba6c81..88c459ba78 100644
--- a/code/__defines/math.dm
+++ b/code/__defines/math.dm
@@ -1,18 +1,228 @@
+// Credits to Nickr5 for the useful procs I've taken from his library resource.
+// This file is quadruple wrapped for your pleasure
+// (
+
+#define NUM_E 2.71828183
+
+#define M_PI (3.14159265)
+#define INFINITY (1.#INF) //closer then enough
+
+#define SHORT_REAL_LIMIT 16777216
+
//"fancy" math for calculating time in ms from tick_usage percentage and the length of ticks
//percent_of_tick_used * (ticklag * 100(to convert to ms)) / 100(percent ratio)
//collapsed to percent_of_tick_used * tick_lag
#define TICK_DELTA_TO_MS(percent_of_tick_used) ((percent_of_tick_used) * world.tick_lag)
-#define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(TICK_USAGE-starting_tickusage))
+#define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(world.tick_usage - starting_tickusage))
+
+#define PERCENT(val) (round((val)*100, 0.1))
+#define CLAMP01(x) (CLAMP(x, 0, 1))
//time of day but automatically adjusts to the server going into the next day within the same round.
//for when you need a reliable time number that doesn't depend on byond time.
#define REALTIMEOFDAY (world.timeofday + (MIDNIGHT_ROLLOVER * MIDNIGHT_ROLLOVER_CHECK))
#define MIDNIGHT_ROLLOVER_CHECK ( rollovercheck_last_timeofday != world.timeofday ? update_midnight_rollover() : midnight_rollovers )
-#define SHORT_REAL_LIMIT 16777216 // 2^24 - Maximum integer that can be exactly represented in a float (BYOND num var)
+#define SIGN(x) ( (x)!=0 ? (x) / abs(x) : 0 )
#define CEILING(x, y) ( -round(-(x) / (y)) * (y) )
+
// round() acts like floor(x, 1) by default but can't handle other values
#define FLOOR(x, y) ( round((x) / (y)) * (y) )
-// Check if a BYOND dir var is a cardinal direction (power of two)
+
+#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) )
+
+// Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive
+#define WRAP(val, min, max) ( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) )
+
+// Real modulus that handles decimals
+#define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) )
+
+// Tangent
+#define TAN(x) (sin(x) / cos(x))
+
+// Cotangent
+#define COT(x) (1 / TAN(x))
+
+// Secant
+#define SEC(x) (1 / cos(x))
+
+// Cosecant
+#define CSC(x) (1 / sin(x))
+
+#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) )
+
+// Greatest Common Divisor - Euclid's algorithm
+/proc/GCD(a, b)
+ return b ? GCD(b, (a) % (b)) : a
+
+// Least Common Multiple
+#define LCM(a, b) (abs(a) / GCD(a, b) * abs(b))
+
#define IS_CARDINAL(x) ((x & (x - 1)) == 0)
+
+#define INVERSE(x) ( 1/(x) )
+
+// Used for calculating the radioactive strength falloff
+#define INVERSE_SQUARE(initial_strength,cur_distance,initial_distance) ( (initial_strength)*((initial_distance)**2/(cur_distance)**2) )
+
+#define ISABOUTEQUAL(a, b, deviation) (deviation ? abs((a) - (b)) <= deviation : abs((a) - (b)) <= 0.1)
+
+#define ISEVEN(x) (x % 2 == 0)
+
+#define ISODD(x) (x % 2 != 0)
+
+// Returns true if val is from min to max, inclusive.
+#define ISINRANGE(val, min, max) (min <= val && val <= max)
+
+// Same as above, exclusive.
+#define ISINRANGE_EX(val, min, max) (min < val && val > max)
+
+#define ISINTEGER(x) (round(x) == x)
+
+#define ISMULTIPLE(x, y) ((x) % (y) == 0)
+
+// 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.
+#define LERP(a, b, amount) ( amount ? ((a) + ((b) - (a)) * (amount)) : a )
+
+// Returns the nth root of x.
+#define ROOT(n, x) ((x) ** (1 / (n)))
+
+/proc/Mean(...)
+ var/sum = 0
+ for(var/val in args)
+ sum += val
+ return sum / args.len
+
+// 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
+ // Return if the roots are imaginary.
+ if(d < 0)
+ return
+ var/root = sqrt(d)
+ . += (-b + root) / bottom
+ // If discriminant == 0, there would be two roots at the same position.
+ if(!d)
+ return
+ . += (-b - root) / bottom
+
+ // 180 / Pi ~ 57.2957795
+#define TODEGREES(radians) ((radians) * 57.2957795)
+
+ // Pi / 180 ~ 0.0174532925
+#define TORADIANS(degrees) ((degrees) * 0.0174532925)
+
+// Will filter out extra rotations and negative rotations
+// E.g: 540 becomes 180. -180 becomes 180.
+#define SIMPLIFY_DEGREES(degrees) (MODULUS((degrees), 360))
+
+#define GET_ANGLE_OF_INCIDENCE(face, input) (MODULUS((face) - (input), 360))
+
+//Finds the shortest angle that angle A has to change to get to angle B. Aka, whether to move clock or counterclockwise.
+/proc/closer_angle_difference(a, b)
+ if(!isnum(a) || !isnum(b))
+ return
+ a = SIMPLIFY_DEGREES(a)
+ b = SIMPLIFY_DEGREES(b)
+ var/inc = b - a
+ if(inc < 0)
+ inc += 360
+ var/dec = a - b
+ if(dec < 0)
+ dec += 360
+ . = inc > dec? -dec : inc
+
+//A logarithm that converts an integer to a number scaled between 0 and 1.
+//Currently, this is used for hydroponics-produce sprite transforming, but could be useful for other transform functions.
+#define TRANSFORM_USING_VARIABLE(input, max) ( sin((90*(input))/(max))**2 )
+
+//converts a uniform distributed random number into a normal distributed one
+//since this method produces two random numbers, one is saved for subsequent calls
+//(making the cost negligble for every second call)
+//This will return +/- decimals, situated about mean with standard deviation stddev
+//68% chance that the number is within 1stddev
+//95% chance that the number is within 2stddev
+//98% chance that the number is within 3stddev...etc
+#define ACCURACY 10000
+/proc/gaussian(mean, stddev)
+ var/static/gaussian_next
+ var/R1;var/R2;var/working
+ if(gaussian_next != null)
+ R1 = gaussian_next
+ gaussian_next = null
+ else
+ do
+ R1 = rand(-ACCURACY,ACCURACY)/ACCURACY
+ R2 = rand(-ACCURACY,ACCURACY)/ACCURACY
+ working = R1*R1 + R2*R2
+ while(working >= 1 || working==0)
+ working = sqrt(-2 * log(working) / working)
+ R1 *= working
+ gaussian_next = R2 * working
+ return (mean + stddev * R1)
+#undef ACCURACY
+
+/proc/get_turf_in_angle(angle, turf/starting, increments)
+ var/pixel_x = 0
+ var/pixel_y = 0
+ for(var/i in 1 to increments)
+ pixel_x += sin(angle)+16*sin(angle)*2
+ pixel_y += cos(angle)+16*cos(angle)*2
+ var/new_x = starting.x
+ var/new_y = starting.y
+ while(pixel_x > 16)
+ pixel_x -= 32
+ new_x++
+ while(pixel_x < -16)
+ pixel_x += 32
+ new_x--
+ while(pixel_y > 16)
+ pixel_y -= 32
+ new_y++
+ while(pixel_y < -16)
+ pixel_y += 32
+ new_y--
+ new_x = CLAMP(new_x, 0, world.maxx)
+ new_y = CLAMP(new_y, 0, world.maxy)
+ return locate(new_x, new_y, starting.z)
+
+// Returns a list where [1] is all x values and [2] is all y values that overlap between the given pair of rectangles
+/proc/get_overlap(x1, y1, x2, y2, x3, y3, x4, y4)
+ var/list/region_x1 = list()
+ var/list/region_y1 = list()
+ var/list/region_x2 = list()
+ var/list/region_y2 = list()
+
+ // These loops create loops filled with x/y values that the boundaries inhabit
+ // ex: list(5, 6, 7, 8, 9)
+ for(var/i in min(x1, x2) to max(x1, x2))
+ region_x1["[i]"] = TRUE
+ for(var/i in min(y1, y2) to max(y1, y2))
+ region_y1["[i]"] = TRUE
+ for(var/i in min(x3, x4) to max(x3, x4))
+ region_x2["[i]"] = TRUE
+ for(var/i in min(y3, y4) to max(y3, y4))
+ region_y2["[i]"] = TRUE
+
+ return list(region_x1 & region_x2, region_y1 & region_y2)
+
+// )
+
+#define RAND_F(LOW, HIGH) (rand()*(HIGH-LOW) + LOW)
+
+#define SQUARE(x) (x*x)
+
+//Vector Algebra
+#define SQUAREDNORM(x, y) (x*x+y*y)
+#define NORM(x, y) (sqrt(SQUAREDNORM(x,y)))
+#define ISPOWEROFTWO(x) ((x & (x - 1)) == 0)
+#define ROUNDUPTOPOWEROFTWO(x) (2 ** -round(-log(2,x)))
+
+#define DEFAULT(a, b) (a? a : b)
diff --git a/code/__defines/math_physics.dm b/code/__defines/math_physics.dm
index da1c2aebd1..b4952f4e11 100644
--- a/code/__defines/math_physics.dm
+++ b/code/__defines/math_physics.dm
@@ -1,10 +1,13 @@
// Math constants.
-#define M_PI 3.14159265
-
#define R_IDEAL_GAS_EQUATION 8.31 // kPa*L/(K*mol).
#define ONE_ATMOSPHERE 101.325 // kPa.
#define IDEAL_GAS_ENTROPY_CONSTANT 1164 // (mol^3 * s^3) / (kg^3 * L).
+#define T0C 273.15 // 0.0 degrees celcius
+#define T20C 293.15 // 20.0 degrees celcius
+#define TCMB 2.7 // -270.3 degrees celcius
+#define TN60C 213.15 // -60 degrees celcius
+
// Radiation constants.
#define STEFAN_BOLTZMANN_CONSTANT 5.6704e-8 // W/(m^2*K^4).
#define COSMIC_RADIATION_TEMPERATURE 3.15 // K.
@@ -15,18 +18,7 @@
#define RADIATOR_EXPOSED_SURFACE_AREA_RATIO 0.04 // (3 cm + 100 cm * sin(3deg))/(2*(3+100 cm)). Unitless ratio.
#define HUMAN_EXPOSED_SURFACE_AREA 5.2 //m^2, surface area of 1.7m (H) x 0.46m (D) cylinder
-#define T0C 273.15 // 0.0 degrees celcius
-#define T20C 293.15 // 20.0 degrees celcius
-#define TCMB 2.7 // -270.3 degrees celcius
-#define TN60C 213.15 // -60 degrees celcius
-
-#define CLAMP01(x) max(0, min(1, x))
#define QUANTIZE(variable) (round(variable,0.0001))
-#define INFINITY 1.#INF
-
-#define TICKS_IN_DAY 24*60*60*10
-#define TICKS_IN_SECOND 10
-
-#define SIMPLE_SIGN(X) ((X) < 0 ? -1 : 1)
-#define SIGN(X) ((X) ? SIMPLE_SIGN(X) : 0)
+#define TICKS_IN_DAY (TICKS_IN_SECOND * 60 * 60 * 24)
+#define TICKS_IN_SECOND (world.fps)
\ No newline at end of file
diff --git a/code/_helpers/maths.dm b/code/_helpers/maths.dm
deleted file mode 100644
index 4cbe75bffc..0000000000
--- a/code/_helpers/maths.dm
+++ /dev/null
@@ -1,131 +0,0 @@
-// Macro functions.
-#define RAND_F(LOW, HIGH) (rand()*(HIGH-LOW) + LOW)
-#define ceil(x) (-round(-(x)))
-
-// 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)
-
-/proc/Default(a, b)
- return a ? a : b
-
-// Trigonometric functions.
-/proc/Tan(x)
- return sin(x) / cos(x)
-
-/proc/Csc(x)
- return 1 / sin(x)
-
-/proc/Sec(x)
- return 1 / cos(x)
-
-/proc/Cot(x)
- return 1 / Tan(x)
-
-/proc/Atan2(x, y)
- if(!x && !y) return 0
- var/a = arccos(x / sqrt(x*x + y*y))
- return y >= 0 ? a : -a
-
-/proc/Floor(x)
- return round(x)
-
-/proc/Ceiling(x)
- return -round(-x)
-
-// Greatest Common Divisor: Euclid's algorithm.
-/proc/Gcd(a, b)
- while (1)
- if (!b) return a
- a %= b
- if (!a) return b
- b %= a
-
-// Least Common Multiple. The formula is a consequence of: a*b = LCM*GCD.
-/proc/Lcm(a, b)
- return abs(a) * abs(b) / Gcd(a, b)
-
-// Useful in the cases when x is a large expression, e.g. x = 3a/2 + b^2 + Function(c)
-/proc/Square(x)
- return x*x
-
-/proc/Inverse(x)
- return 1 / x
-
-// Condition checks.
-/proc/IsAboutEqual(a, b, delta = 0.1)
- return abs(a - b) <= delta
-
-// Returns true if val is from min to max, inclusive.
-/proc/IsInRange(val, min, max)
- return (val >= min) && (val <= max)
-
-/proc/IsInteger(x)
- return Floor(x) == x
-
-/proc/IsMultiple(x, y)
- return x % y == 0
-
-/proc/IsEven(x)
- return !(x & 0x1)
-
-/proc/IsOdd(x)
- return (x & 0x1)
-
-// Performs a linear interpolation between a and b.
-// Note: weight=0 returns a, weight=1 returns b, and weight=0.5 returns the mean of a and b.
-/proc/Interpolate(a, b, weight = 0.5)
- return a + (b - a) * weight // Equivalent to: a*(1 - weight) + b*weight
-
-/proc/Mean(...)
- var/sum = 0
- for(var/val in args)
- sum += val
- return sum / args.len
-
-// Returns the nth root of x.
-/proc/Root(n, x)
- return x ** (1 / n)
-
-// 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/discriminant = b*b - 4*a*c
- var/bottom = 2*a
-
- // Return if the roots are imaginary.
- if(discriminant < 0)
- return
-
- var/root = sqrt(discriminant)
- . += (-b + root) / bottom
-
- // If discriminant == 0, there would be two roots at the same position.
- if(discriminant != 0)
- . += (-b - root) / bottom
-
-/proc/ToDegrees(radians)
- // 180 / Pi ~ 57.2957795
- return radians * 57.2957795
-
-/proc/ToRadians(degrees)
- // Pi / 180 ~ 0.0174532925
- return degrees * 0.0174532925
-
-// Vector algebra.
-/proc/squaredNorm(x, y)
- return x*x + y*y
-
-/proc/norm(x, y)
- return sqrt(squaredNorm(x, y))
-
-/proc/IsPowerOfTwo(var/val)
- return (val & (val-1)) == 0
-
-/proc/RoundUpToPowerOfTwo(var/val)
- return 2 ** -round(-log(2,val))
diff --git a/code/_helpers/vector.dm b/code/_helpers/vector.dm
index 44d293734c..875f0e4bfd 100644
--- a/code/_helpers/vector.dm
+++ b/code/_helpers/vector.dm
@@ -78,13 +78,13 @@ return_location()
return
// calculate the angle
- angle = Atan2(dx, dy) + angle_offset
+ angle = ATAN2(dx, dy) + angle_offset
// and some rounding to stop the increments jumping whole turfs - because byond favours certain angles
if(angle > -135 && angle < 45)
- angle = Ceiling(angle)
+ angle = CEILING(angle, 1)
else
- angle = Floor(angle)
+ angle = FLOOR(angle, 1)
// calculate the offset per increment step
if(abs(angle) in list(0, 45, 90, 135, 180)) // check if the angle is a cardinal
@@ -93,11 +93,11 @@ return_location()
if(abs(angle) in list(45, 90, 135))
offset_y = sign(dy)
else if(abs(dy) > abs(dx))
- offset_x = Cot(abs(angle)) // otherwise set the offsets
+ offset_x = COT(abs(angle)) // otherwise set the offsets
offset_y = sign(dy)
else
offset_x = sign(dx)
- offset_y = Tan(angle)
+ offset_y = TAN(angle)
if(dx < 0)
offset_y = -offset_y
diff --git a/code/controllers/subsystems/overlays.dm b/code/controllers/subsystems/overlays.dm
index 5c8b3531c9..60b08c71d2 100644
--- a/code/controllers/subsystems/overlays.dm
+++ b/code/controllers/subsystems/overlays.dm
@@ -168,7 +168,7 @@ var/global/image/appearance_bro = new() // Temporarily super-global because of B
* Adds specific overlay(s) to the atom.
* It is designed so any of the types allowed to be added to /atom/overlays can be added here too. More details below.
*
- * @param overlays The overlay(s) to add. These may be
+ * @param overlays The overlay(s) to add. These may be
* - A string: In which case it is treated as an icon_state of the atom's icon.
* - An icon: It is treated as an icon.
* - An atom: Its own overlays are compiled and then it's appearance is added. (Meaning its current apperance is frozen).
@@ -205,7 +205,7 @@ var/global/image/appearance_bro = new() // Temporarily super-global because of B
/**
* Copy the overlays from another atom, either replacing all of ours or appending to our existing overlays.
* Note: This copies only the normal overlays, not the "priority" overlays.
- *
+ *
* @param other The atom to copy overlays from.
* @param cut_old If true, all of our overlays will be *replaced* by the other's. If other is null, that means cutting all ours.
*/
diff --git a/code/datums/beam.dm b/code/datums/beam.dm
index 12c22430db..51b58f462e 100644
--- a/code/datums/beam.dm
+++ b/code/datums/beam.dm
@@ -102,11 +102,11 @@
//Position the effect so the beam is one continous line
var/a
if(abs(Pixel_x)>32)
- a = Pixel_x > 0 ? round(Pixel_x/32) : Ceiling(Pixel_x/32)
+ a = Pixel_x > 0 ? round(Pixel_x/32) : CEILING(Pixel_x/32, 1)
X.x += a
Pixel_x %= 32
if(abs(Pixel_y)>32)
- a = Pixel_y > 0 ? round(Pixel_y/32) : Ceiling(Pixel_y/32)
+ a = Pixel_y > 0 ? round(Pixel_y/32) : CEILING(Pixel_y/32, 1)
X.y += a
Pixel_y %= 32
diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm
index f66b580c52..cc982ce207 100644
--- a/code/game/machinery/bioprinter.dm
+++ b/code/game/machinery/bioprinter.dm
@@ -287,7 +287,7 @@
/obj/machinery/organ_printer/robot/dismantle()
if(stored_matter >= matter_amount_per_sheet)
- new /obj/item/stack/material/steel(get_turf(src), Floor(stored_matter/matter_amount_per_sheet))
+ new /obj/item/stack/material/steel(get_turf(src), FLOOR(stored_matter/matter_amount_per_sheet, 1))
return ..()
/obj/machinery/organ_printer/robot/print_organ(var/choice)
@@ -305,7 +305,7 @@
return
var/obj/item/stack/S = W
var/space_left = max_stored_matter - stored_matter
- var/sheets_to_take = min(S.amount, Floor(space_left/matter_amount_per_sheet))
+ var/sheets_to_take = min(S.amount, FLOOR(space_left/matter_amount_per_sheet, 1))
if(sheets_to_take <= 0)
to_chat(user, "\The [src] is too full.")
return
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 6b5926042f..8e3cb117f9 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -194,7 +194,7 @@
occupant.adjustCloneLoss(-2 * heal_rate)
//Premature clones may have brain damage.
- occupant.adjustBrainLoss(-(ceil(0.5*heal_rate)))
+ occupant.adjustBrainLoss(-(CEILING(0.5*heal_rate, 1)))
//So clones don't die of oxyloss in a running pod.
if(occupant.reagents.get_reagent_amount("inaprovaline") < 30)
diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm
index f4926c2aa8..693f213d2e 100644
--- a/code/game/machinery/doors/blast_door.dm
+++ b/code/game/machinery/doors/blast_door.dm
@@ -151,7 +151,7 @@
return
else if(istype(C, /obj/item/stack/material) && C.get_material_name() == "plasteel") // Repairing.
- var/amt = Ceiling((maxhealth - health)/150)
+ var/amt = CEILING((maxhealth - health)/150, 1)
if(!amt)
to_chat(user, "\The [src] is already fully repaired.")
return
diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm
index 436ebabcc9..43b42cbac9 100644
--- a/code/game/objects/effects/chem/chemsmoke.dm
+++ b/code/game/objects/effects/chem/chemsmoke.dm
@@ -130,9 +130,9 @@
var/offset = 0
var/points = round((radius * 2 * M_PI) / arcLength)
- var/angle = round(ToDegrees(arcLength / radius), 1)
+ var/angle = round(TODEGREES(arcLength / radius), 1)
- if(!IsInteger(radius))
+ if(!ISINTEGER(radius))
offset = 45 //degrees
for(var/j = 0, j < points, j++)
diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm
index 1ddfa04bf0..8d85efb753 100644
--- a/code/game/objects/items/devices/defib.dm
+++ b/code/game/objects/items/devices/defib.dm
@@ -53,7 +53,7 @@
else
new_overlays += "[initial(icon_state)]-powered"
- var/ratio = Ceiling(bcell.percent()/25) * 25
+ var/ratio = CEILING(bcell.percent()/25, 1) * 25
new_overlays += "[initial(icon_state)]-charge[ratio]"
else
new_overlays += "[initial(icon_state)]-nocell"
diff --git a/code/game/objects/items/weapons/id cards/cards.dm b/code/game/objects/items/weapons/id cards/cards.dm
index e7a3d3f4d5..389601ef1f 100644
--- a/code/game/objects/items/weapons/id cards/cards.dm
+++ b/code/game/objects/items/weapons/id cards/cards.dm
@@ -101,6 +101,6 @@
usr << "You are not adding enough telecrystals to fuel \the [src]."
return
uses += T.amount/2 //Gives 5 uses per 10 TC
- uses = ceil(uses) //Ensures no decimal uses nonsense, rounds up to be nice
+ uses = CEILING(uses, 1) //Ensures no decimal uses nonsense, rounds up to be nice
usr << "You add \the [O] to \the [src]. Increasing the uses of \the [src] to [uses]."
qdel(O)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm
index 7c2f2ea26f..ed7ed9e21c 100644
--- a/code/game/objects/items/weapons/tools/weldingtool.dm
+++ b/code/game/objects/items/weapons/tools/weldingtool.dm
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
#define WELDER_FUEL_BURN_INTERVAL 13
/*
* Welding Tool
@@ -610,3 +611,609 @@
toolspeed = 0.5
#undef WELDER_FUEL_BURN_INTERVAL
+=======
+#define WELDER_FUEL_BURN_INTERVAL 13
+/*
+ * Welding Tool
+ */
+/obj/item/weapon/weldingtool
+ name = "\improper welding tool"
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "welder"
+ item_state = "welder"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+
+ //Amount of OUCH when it's thrown
+ force = 3.0
+ throwforce = 5.0
+ throw_speed = 1
+ throw_range = 5
+ w_class = ITEMSIZE_SMALL
+
+ //Cost to make in the autolathe
+ matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 30)
+
+ //R&D tech level
+ origin_tech = list(TECH_ENGINEERING = 1)
+
+ //Welding tool specific stuff
+ var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
+ var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
+ var/max_fuel = 20 //The max amount of fuel the welder can hold
+
+ var/acti_sound = 'sound/items/welderactivate.ogg'
+ var/deac_sound = 'sound/items/welderdeactivate.ogg'
+ usesound = 'sound/items/Welder2.ogg'
+ var/change_icons = TRUE
+ var/flame_intensity = 2 //how powerful the emitted light is when used.
+ var/flame_color = "#FF9933" // What color the welder light emits when its on. Default is an orange-ish color.
+ var/eye_safety_modifier = 0 // Increasing this will make less eye protection needed to stop eye damage. IE at 1, sunglasses will fully protect.
+ var/burned_fuel_for = 0 // Keeps track of how long the welder's been on, used to gradually empty the welder if left one, without RNG.
+ var/always_process = FALSE // If true, keeps the welder on the process list even if it's off. Used for when it needs to regenerate fuel.
+ toolspeed = 1
+
+/obj/item/weapon/weldingtool/New()
+// var/random_fuel = min(rand(10,20),max_fuel)
+ var/datum/reagents/R = new/datum/reagents(max_fuel)
+ reagents = R
+ R.my_atom = src
+ R.add_reagent("fuel", max_fuel)
+ update_icon()
+ if(always_process)
+ processing_objects |= src
+ ..()
+
+/obj/item/weapon/weldingtool/Destroy()
+ if(welding || always_process)
+ processing_objects -= src
+ return ..()
+
+/obj/item/weapon/weldingtool/examine(mob/user)
+ if(..(user, 0))
+ if(max_fuel)
+ to_chat(user, text("\icon[] The [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel ))
+
+/obj/item/weapon/weldingtool/attack(var/atom/A, var/mob/living/user, var/def_zone)
+ if(ishuman(A) && user.a_intent == I_HELP)
+ var/mob/living/carbon/human/H = A
+ var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting]
+
+ if(!S || S.robotic < ORGAN_ROBOT || S.open == 3)
+ return ..()
+
+ if(!welding)
+ to_chat(user, "You'll need to turn [src] on to patch the damage on [H]'s [S.name]!")
+ return 1
+
+ if(S.robo_repair(15, BRUTE, "some dents", src, user))
+ remove_fuel(1, user)
+ return 1
+
+ return ..()
+
+/obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/living/user as mob)
+ if(istype(W,/obj/item/weapon/tool/screwdriver))
+ if(welding)
+ to_chat(user, "Stop welding first!")
+ return
+ status = !status
+ if(status)
+ to_chat(user, "You secure the welder.")
+ else
+ to_chat(user, "The welder can now be attached and modified.")
+ src.add_fingerprint(user)
+ return
+
+ if((!status) && (istype(W,/obj/item/stack/rods)))
+ var/obj/item/stack/rods/R = W
+ R.use(1)
+ var/obj/item/weapon/flamethrower/F = new/obj/item/weapon/flamethrower(user.loc)
+ src.loc = F
+ F.weldtool = src
+ if (user.client)
+ user.client.screen -= src
+ if (user.r_hand == src)
+ user.remove_from_mob(src)
+ else
+ user.remove_from_mob(src)
+ src.master = F
+ src.layer = initial(src.layer)
+ user.remove_from_mob(src)
+ if (user.client)
+ user.client.screen -= src
+ src.loc = F
+ src.add_fingerprint(user)
+ return
+
+ ..()
+ return
+
+
+/obj/item/weapon/weldingtool/process()
+ if(welding)
+ ++burned_fuel_for
+ if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL)
+ remove_fuel(1)
+ if(get_fuel() < 1)
+ setWelding(0)
+ //I'm not sure what this does. I assume it has to do with starting fires...
+ //...but it doesnt check to see if the welder is on or not.
+ var/turf/location = src.loc
+ if(istype(location, /mob/living))
+ var/mob/living/M = location
+ if(M.item_is_in_hands(src))
+ location = get_turf(M)
+ if (istype(location, /turf))
+ location.hotspot_expose(700, 5)
+
+/obj/item/weapon/weldingtool/afterattack(obj/O as obj, mob/user as mob, proximity)
+ if(!proximity) return
+ if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1)
+ if(!welding && max_fuel)
+ O.reagents.trans_to_obj(src, max_fuel)
+ to_chat(user, "Welder refueled")
+ playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
+ return
+ else if(!welding)
+ to_chat(user, "[src] doesn't use fuel.")
+ return
+ else
+ message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.")
+ log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.")
+ to_chat(user, "You begin welding on the fueltank and with a moment of lucidity you realize, this might not have been the smartest thing you've ever done.")
+ var/obj/structure/reagent_dispensers/fueltank/tank = O
+ tank.explode()
+ return
+ if (src.welding)
+ remove_fuel(1)
+ var/turf/location = get_turf(user)
+ if(isliving(O))
+ var/mob/living/L = O
+ L.IgniteMob()
+ if (istype(location, /turf))
+ location.hotspot_expose(700, 50, 1)
+
+/obj/item/weapon/weldingtool/attack_self(mob/user as mob)
+ setWelding(!welding, usr)
+
+//Returns the amount of fuel in the welder
+/obj/item/weapon/weldingtool/proc/get_fuel()
+ return reagents.get_reagent_amount("fuel")
+
+/obj/item/weapon/weldingtool/proc/get_max_fuel()
+ return max_fuel
+
+//Removes fuel from the welding tool. If a mob is passed, it will perform an eyecheck on the mob. This should probably be renamed to use()
+/obj/item/weapon/weldingtool/proc/remove_fuel(var/amount = 1, var/mob/M = null)
+ if(!welding)
+ return 0
+ if(amount)
+ burned_fuel_for = 0 // Reset the counter since we're removing fuel.
+ if(get_fuel() >= amount)
+ reagents.remove_reagent("fuel", amount)
+ if(M)
+ eyecheck(M)
+ update_icon()
+ return 1
+ else
+ if(M)
+ to_chat(M, "You need more welding fuel to complete this task.")
+ update_icon()
+ return 0
+
+//Returns whether or not the welding tool is currently on.
+/obj/item/weapon/weldingtool/proc/isOn()
+ return welding
+
+/obj/item/weapon/weldingtool/update_icon()
+ ..()
+ overlays.Cut()
+ // Welding overlay.
+ if(welding)
+ var/image/I = image(icon, src, "[icon_state]-on")
+ overlays.Add(I)
+ item_state = "[initial(item_state)]1"
+ else
+ item_state = initial(item_state)
+
+ // Fuel counter overlay.
+ if(change_icons && get_max_fuel())
+ var/ratio = get_fuel() / get_max_fuel()
+ ratio = CEILING(ratio * 4, 1) * 25
+ var/image/I = image(icon, src, "[icon_state][ratio]")
+ overlays.Add(I)
+
+ // Lights
+ if(welding && flame_intensity)
+ set_light(flame_intensity, flame_intensity, flame_color)
+ else
+ set_light(0)
+
+// icon_state = welding ? "[icon_state]1" : "[initial(icon_state)]"
+ var/mob/M = loc
+ if(istype(M))
+ M.update_inv_l_hand()
+ M.update_inv_r_hand()
+
+/obj/item/weapon/weldingtool/MouseDrop(obj/over_object as obj)
+ if(!canremove)
+ return
+
+ if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
+
+ if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why?
+ return
+
+ if (!( istype(over_object, /obj/screen) ))
+ return ..()
+
+ //makes sure that the thing is equipped, so that we can't drag it into our hand from miles away.
+ //there's got to be a better way of doing this.
+ if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
+ return
+
+ if (( usr.restrained() ) || ( usr.stat ))
+ return
+
+ if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src))
+ return
+
+ switch(over_object.name)
+ if("r_hand")
+ usr.u_equip(src)
+ usr.put_in_r_hand(src)
+ if("l_hand")
+ usr.u_equip(src)
+ usr.put_in_l_hand(src)
+ src.add_fingerprint(usr)
+
+//Sets the welding state of the welding tool. If you see W.welding = 1 anywhere, please change it to W.setWelding(1)
+//so that the welding tool updates accordingly
+/obj/item/weapon/weldingtool/proc/setWelding(var/set_welding, var/mob/M)
+ if(!status) return
+
+ var/turf/T = get_turf(src)
+ //If we're turning it on
+ if(set_welding && !welding)
+ if (get_fuel() > 0)
+ if(M)
+ to_chat(M, "You switch the [src] on.")
+ else if(T)
+ T.visible_message("\The [src] turns on.")
+ playsound(loc, acti_sound, 50, 1)
+ src.force = 15
+ src.damtype = "fire"
+ src.w_class = ITEMSIZE_LARGE
+ src.hitsound = 'sound/items/welder.ogg'
+ welding = 1
+ update_icon()
+ if(!always_process)
+ processing_objects |= src
+ else
+ if(M)
+ var/msg = max_fuel ? "welding fuel" : "charge"
+ to_chat(M, "You need more [msg] to complete this task.")
+ return
+ //Otherwise
+ else if(!set_welding && welding)
+ if(!always_process)
+ processing_objects -= src
+ if(M)
+ to_chat(M, "You switch \the [src] off.")
+ else if(T)
+ T.visible_message("\The [src] turns off.")
+ playsound(loc, deac_sound, 50, 1)
+ src.force = 3
+ src.damtype = "brute"
+ src.w_class = initial(src.w_class)
+ src.welding = 0
+ src.hitsound = initial(src.hitsound)
+ update_icon()
+
+//Decides whether or not to damage a player's eyes based on what they're wearing as protection
+//Note: This should probably be moved to mob
+/obj/item/weapon/weldingtool/proc/eyecheck(mob/living/carbon/user)
+ if(!istype(user))
+ return 1
+ var/safety = user.eyecheck()
+ safety = between(-1, safety + eye_safety_modifier, 2)
+ if(istype(user, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
+ if(!E)
+ return
+ switch(safety)
+ if(1)
+ to_chat(usr, "Your eyes sting a little.")
+ E.damage += rand(1, 2)
+ if(E.damage > 12)
+ user.eye_blurry += rand(3,6)
+ if(0)
+ to_chat(usr, "Your eyes burn.")
+ E.damage += rand(2, 4)
+ if(E.damage > 10)
+ E.damage += rand(4,10)
+ if(-1)
+ to_chat(usr, "Your thermals intensify the welder's glow. Your eyes itch and burn severely.")
+ user.eye_blurry += rand(12,20)
+ E.damage += rand(12, 16)
+ if(safety<2)
+
+ if(E.damage > 10)
+ to_chat(user, "Your eyes are really starting to hurt. This can't be good for you!")
+
+ if (E.damage >= E.min_broken_damage)
+ to_chat(user, "You go blind!")
+ user.sdisabilities |= BLIND
+ else if (E.damage >= E.min_bruised_damage)
+ to_chat(user, "You go blind!")
+ user.Blind(5)
+ user.eye_blurry = 5
+ user.disabilities |= NEARSIGHTED
+ spawn(100)
+ user.disabilities &= ~NEARSIGHTED
+ return
+
+/obj/item/weapon/weldingtool/is_hot()
+ return isOn()
+
+/obj/item/weapon/weldingtool/largetank
+ name = "industrial welding tool"
+ desc = "A slightly larger welder with a larger tank."
+ icon_state = "indwelder"
+ max_fuel = 40
+ origin_tech = list(TECH_ENGINEERING = 2, TECH_PHORON = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 60)
+
+/obj/item/weapon/weldingtool/largetank/cyborg
+ name = "integrated welding tool"
+ desc = "An advanced welder designed to be used in robotic systems."
+ toolspeed = 0.5
+
+/obj/item/weapon/weldingtool/hugetank
+ name = "upgraded welding tool"
+ desc = "A much larger welder with a huge tank."
+ icon_state = "indwelder"
+ max_fuel = 80
+ w_class = ITEMSIZE_NORMAL
+ origin_tech = list(TECH_ENGINEERING = 3)
+ matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120)
+
+/obj/item/weapon/weldingtool/mini
+ name = "emergency welding tool"
+ desc = "A miniature welder used during emergencies."
+ icon_state = "miniwelder"
+ max_fuel = 10
+ w_class = ITEMSIZE_SMALL
+ matter = list(MAT_METAL = 30, MAT_GLASS = 10)
+ change_icons = 0
+ toolspeed = 2
+ eye_safety_modifier = 1 // Safer on eyes.
+
+/obj/item/weapon/weldingtool/alien
+ name = "alien welding tool"
+ desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "welder"
+ toolspeed = 0.1
+ flame_color = "#6699FF" // Light bluish.
+ eye_safety_modifier = 2
+ change_icons = 0
+ origin_tech = list(TECH_PHORON = 5 ,TECH_ENGINEERING = 5)
+ always_process = TRUE
+
+/obj/item/weapon/weldingtool/alien/process()
+ if(get_fuel() <= get_max_fuel())
+ reagents.add_reagent("fuel", 1)
+ ..()
+
+/obj/item/weapon/weldingtool/experimental
+ name = "experimental welding tool"
+ desc = "An experimental welder capable of synthesizing its own fuel from waste compounds. It can output a flame hotter than regular welders."
+ icon_state = "exwelder"
+ max_fuel = 40
+ w_class = ITEMSIZE_NORMAL
+ origin_tech = list(TECH_ENGINEERING = 4, TECH_PHORON = 3)
+ matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120)
+ toolspeed = 0.5
+ change_icons = 0
+ flame_intensity = 3
+ always_process = TRUE
+ var/nextrefueltick = 0
+
+/obj/item/weapon/weldingtool/experimental/process()
+ ..()
+ if(get_fuel() < get_max_fuel() && nextrefueltick < world.time)
+ nextrefueltick = world.time + 10
+ reagents.add_reagent("fuel", 1)
+
+/*
+ * Backpack Welder.
+ */
+
+/obj/item/weapon/weldingtool/tubefed
+ name = "tube-fed welding tool"
+ desc = "A bulky, cooler-burning welding tool that draws from a worn welding tank."
+ icon_state = "tubewelder"
+ max_fuel = 10
+ w_class = ITEMSIZE_NO_CONTAINER
+ matter = null
+ toolspeed = 1.25
+ change_icons = 0
+ flame_intensity = 1
+ eye_safety_modifier = 1
+ always_process = TRUE
+ var/obj/item/weapon/weldpack/mounted_pack = null
+
+/obj/item/weapon/weldingtool/tubefed/New(location)
+ ..()
+ if(istype(location, /obj/item/weapon/weldpack))
+ var/obj/item/weapon/weldpack/holder = location
+ mounted_pack = holder
+ else
+ qdel(src)
+
+/obj/item/weapon/weldingtool/tubefed/Destroy()
+ mounted_pack.nozzle = null
+ mounted_pack = null
+ return ..()
+
+/obj/item/weapon/weldingtool/tubefed/process()
+ if(mounted_pack)
+ if(!istype(mounted_pack.loc,/mob/living/carbon/human))
+ mounted_pack.return_nozzle()
+ else
+ var/mob/living/carbon/human/H = mounted_pack.loc
+ if(H.back != mounted_pack)
+ mounted_pack.return_nozzle()
+
+ if(mounted_pack.loc != src.loc && src.loc != mounted_pack)
+ mounted_pack.return_nozzle()
+ visible_message("\The [src] retracts to its fueltank.")
+
+ if(get_fuel() <= get_max_fuel())
+ mounted_pack.reagents.trans_to_obj(src, 1)
+
+ ..()
+
+/obj/item/weapon/weldingtool/tubefed/dropped(mob/user)
+ ..()
+ if(src.loc != user)
+ mounted_pack.return_nozzle()
+ to_chat(user, "\The [src] retracts to its fueltank.")
+
+/*
+ * Electric/Arc Welder
+ */
+
+/obj/item/weapon/weldingtool/electric //AND HIS WELDING WAS ELECTRIC
+ name = "electric welding tool"
+ desc = "A welder which runs off of electricity."
+ icon_state = "arcwelder"
+ max_fuel = 0 //We'll handle the consumption later.
+ item_state = "ewelder"
+ var/obj/item/weapon/cell/power_supply //What type of power cell this uses
+ var/charge_cost = 24 //The rough equivalent of 1 unit of fuel, based on us wanting 10 welds per battery
+ var/cell_type = /obj/item/weapon/cell/device
+ var/use_external_power = 0 //If in a borg or hardsuit, this needs to = 1
+ flame_color = "#00CCFF" // Blue-ish, to set it apart from the gas flames.
+ acti_sound = 'sound/effects/sparks4.ogg'
+ deac_sound = 'sound/effects/sparks4.ogg'
+
+/obj/item/weapon/weldingtool/electric/unloaded/New()
+ cell_type = null
+
+/obj/item/weapon/weldingtool/electric/New()
+ ..()
+ if(cell_type == null)
+ update_icon()
+ else if(cell_type)
+ power_supply = new cell_type(src)
+ else
+ power_supply = new /obj/item/weapon/cell/device(src)
+ update_icon()
+
+/obj/item/weapon/weldingtool/electric/get_cell()
+ return power_supply
+
+/obj/item/weapon/weldingtool/electric/examine(mob/user)
+ if(get_dist(src, user) > 1)
+ to_chat(user, desc)
+ else // The << need to stay, for some reason
+ if(power_supply)
+ user << text("\icon[] The [] has [] charge left.", src, src.name, get_fuel())
+ else
+ user << text("\icon[] The [] has no power cell!", src, src.name)
+
+/obj/item/weapon/weldingtool/electric/get_fuel()
+ if(use_external_power)
+ var/obj/item/weapon/cell/external = get_external_power_supply()
+ if(external)
+ return external.charge
+ else if(power_supply)
+ return power_supply.charge
+ else
+ return 0
+
+/obj/item/weapon/weldingtool/electric/get_max_fuel()
+ if(use_external_power)
+ var/obj/item/weapon/cell/external = get_external_power_supply()
+ if(external)
+ return external.maxcharge
+ else if(power_supply)
+ return power_supply.maxcharge
+ return 0
+
+/obj/item/weapon/weldingtool/electric/remove_fuel(var/amount = 1, var/mob/M = null)
+ if(!welding)
+ return 0
+ if(get_fuel() >= amount)
+ power_supply.checked_use(charge_cost)
+ if(use_external_power)
+ var/obj/item/weapon/cell/external = get_external_power_supply()
+ if(!external || !external.use(charge_cost)) //Take power from the borg...
+ power_supply.give(charge_cost) //Give it back to the cell.
+ if(M)
+ eyecheck(M)
+ update_icon()
+ return 1
+ else
+ if(M)
+ to_chat(M, "You need more energy to complete this task.")
+ update_icon()
+ return 0
+
+/obj/item/weapon/weldingtool/electric/attack_hand(mob/user as mob)
+ if(user.get_inactive_hand() == src)
+ if(power_supply)
+ power_supply.update_icon()
+ user.put_in_hands(power_supply)
+ power_supply = null
+ to_chat(user, "You remove the cell from the [src].")
+ setWelding(0)
+ update_icon()
+ return
+ ..()
+ else
+ return ..()
+
+/obj/item/weapon/weldingtool/electric/attackby(obj/item/weapon/W, mob/user as mob)
+ if(istype(W, /obj/item/weapon/cell))
+ if(istype(W, /obj/item/weapon/cell/device))
+ if(!power_supply)
+ user.drop_item()
+ W.loc = src
+ power_supply = W
+ to_chat(user, "You install a cell in \the [src].")
+ update_icon()
+ else
+ to_chat(user, "\The [src] already has a cell.")
+ else
+ to_chat(user, "\The [src] cannot use that type of cell.")
+ else
+ ..()
+
+/obj/item/weapon/weldingtool/electric/proc/get_external_power_supply()
+ if(isrobot(src.loc))
+ var/mob/living/silicon/robot/R = src.loc
+ return R.cell
+ if(istype(src.loc, /obj/item/rig_module))
+ var/obj/item/rig_module/module = src.loc
+ if(module.holder && module.holder.wearer)
+ var/mob/living/carbon/human/H = module.holder.wearer
+ if(istype(H) && H.back)
+ var/obj/item/weapon/rig/suit = H.back
+ if(istype(suit))
+ return suit.cell
+ return null
+
+/obj/item/weapon/weldingtool/electric/mounted
+ use_external_power = 1
+
+/obj/item/weapon/weldingtool/electric/mounted/cyborg
+ toolspeed = 0.5
+
+#undef WELDER_FUEL_BURN_INTERVAL
+
+>>>>>>> 8da11c1... Makes math helpers defines for performance (#5654)
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 4a392c0bfe..41f2830e09 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -47,7 +47,7 @@
// adjust locker size to hold all items with 5 units of free store room
var/content_size = 0
for(I in src.contents)
- content_size += Ceiling(I.w_class/2)
+ content_size += CEILING(I.w_class/2, 1)
if(content_size > storage_capacity-5)
storage_capacity = content_size + 5
update_icon()
@@ -57,7 +57,7 @@
var/content_size = 0
for(var/obj/item/I in src.contents)
if(!I.anchored)
- content_size += Ceiling(I.w_class/2)
+ content_size += CEILING(I.w_class/2, 1)
if(!content_size)
to_chat(user, "It is empty.")
else if(storage_capacity > content_size*4)
@@ -154,7 +154,7 @@
/obj/structure/closet/proc/store_items(var/stored_units)
var/added_units = 0
for(var/obj/item/I in src.loc)
- var/item_size = Ceiling(I.w_class / 2)
+ var/item_size = CEILING(I.w_class / 2, 1)
if(stored_units + added_units + item_size > storage_capacity)
continue
if(!I.anchored)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 5c7adf8f0e..edc128012c 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -458,7 +458,7 @@
// Damage overlays.
var/ratio = health / maxhealth
- ratio = Ceiling(ratio * 4) * 25
+ ratio = CEILING(ratio * 4, 1) * 25
if(ratio > 75)
return
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index b20ea437e7..7e2ddb0467 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -239,7 +239,7 @@ proc/admin_notice(var/message, var/rights)
// Display the notes on the current page
var/number_pages = note_keys.len / PLAYER_NOTES_ENTRIES_PER_PAGE
- // Emulate ceil(why does BYOND not have ceil)
+ // Emulate CEILING(why does BYOND not have ceil, 1)
if(number_pages != round(number_pages))
number_pages = round(number_pages) + 1
var/page_index = page - 1
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 293e2601cc..da60d48940 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -546,7 +546,7 @@
data["charge"] = cell ? round(cell.charge,1) : 0
data["maxcharge"] = cell ? cell.maxcharge : 0
- data["chargestatus"] = cell ? Floor((cell.charge/cell.maxcharge)*50) : 0
+ data["chargestatus"] = cell ? FLOOR((cell.charge/cell.maxcharge)*50, 1) : 0
data["emagged"] = subverted
data["coverlock"] = locked
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index 4a7f7490e9..bcd79b0cae 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -50,7 +50,7 @@
kill()
return
- if(IsMultiple(activeFor, 5))
+ if(ISMULTIPLE(activeFor, 5))
if(prob(15))
var/obj/machinery/vending/infectedMachine = pick(vendingMachines)
vendingMachines.Remove(infectedMachine)
@@ -58,8 +58,12 @@
infectedMachine.shut_up = 0
infectedMachine.shoot_inventory = 1
+<<<<<<< HEAD
if(IsMultiple(activeFor, 12))
/* VORESTATION Removal - Using the pick below.
+=======
+ if(ISMULTIPLE(activeFor, 12))
+>>>>>>> 8da11c1... Makes math helpers defines for performance (#5654)
originMachine.speak(pick("Try our aggressive new marketing strategies!", \
"You should buy products to feed your lifestyle obsession!", \
"Consume!", \
diff --git a/code/modules/food/kitchen/cooking_machines/_cooker.dm b/code/modules/food/kitchen/cooking_machines/_cooker.dm
index a361bf3007..0ff53f4db7 100644
--- a/code/modules/food/kitchen/cooking_machines/_cooker.dm
+++ b/code/modules/food/kitchen/cooking_machines/_cooker.dm
@@ -171,7 +171,7 @@
cooking_obj = null
else
var/failed
- var/overcook_period = max(Floor(cook_time/5),1)
+ var/overcook_period = max(FLOOR(cook_time/5, 1),1)
cooking_obj = result
var/count = overcook_period
while(1)
diff --git a/code/modules/gamemaster/actions/carp_migration.dm b/code/modules/gamemaster/actions/carp_migration.dm
index 7c76a5119c..b161182d60 100644
--- a/code/modules/gamemaster/actions/carp_migration.dm
+++ b/code/modules/gamemaster/actions/carp_migration.dm
@@ -32,7 +32,7 @@
var/activeness = ((metric.assess_department(ROLE_SECURITY) + metric.assess_department(ROLE_ENGINEERING) + metric.assess_department(ROLE_MEDICAL)) / 3)
activeness = max(activeness, 20)
- carp_amount = Ceiling(station_strength * (activeness / 100) + 1)
+ carp_amount = CEILING(station_strength * (activeness / 100) + 1, 1)
/datum/gm_action/carp_migration/start()
..()
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
index cbeff5fb34..fc23cc0670 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards.dm
@@ -413,7 +413,7 @@
overlays += I
return
- var/offset = Floor(20/cards.len)
+ var/offset = FLOOR(20/cards.len, 1)
var/matrix/M = matrix()
if(direction)
diff --git a/code/modules/integrated_electronics/subtypes/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm
index 0ec00be317..316742e488 100644
--- a/code/modules/integrated_electronics/subtypes/converters.dm
+++ b/code/modules/integrated_electronics/subtypes/converters.dm
@@ -265,7 +265,7 @@
pull_data()
var/incoming = get_pin_data(IC_INPUT, 1)
if(!isnull(incoming))
- result = ToDegrees(incoming)
+ result = TODEGREES(incoming)
set_pin_data(IC_OUTPUT, 1, result)
push_data()
@@ -283,7 +283,7 @@
pull_data()
var/incoming = get_pin_data(IC_INPUT, 1)
if(!isnull(incoming))
- result = ToRadians(incoming)
+ result = TORADIANS(incoming)
set_pin_data(IC_OUTPUT, 1, result)
push_data()
diff --git a/code/modules/integrated_electronics/subtypes/trig.dm b/code/modules/integrated_electronics/subtypes/trig.dm
index daadf52d42..303053639f 100644
--- a/code/modules/integrated_electronics/subtypes/trig.dm
+++ b/code/modules/integrated_electronics/subtypes/trig.dm
@@ -71,7 +71,7 @@
var/result = null
var/A = get_pin_data(IC_INPUT, 1)
if(!isnull(A))
- result = Tan(A)
+ result = TAN(A)
set_pin_data(IC_OUTPUT, 1, result)
push_data()
@@ -91,7 +91,7 @@
var/result = null
var/A = get_pin_data(IC_INPUT, 1)
if(!isnull(A))
- result = Csc(A)
+ result = CSC(A)
set_pin_data(IC_OUTPUT, 1, result)
push_data()
@@ -112,7 +112,7 @@
var/result = null
var/A = get_pin_data(IC_INPUT, 1)
if(!isnull(A))
- result = Sec(A)
+ result = SEC(A)
set_pin_data(IC_OUTPUT, 1, result)
push_data()
@@ -133,7 +133,7 @@
var/result = null
var/A = get_pin_data(IC_INPUT, 1)
if(!isnull(A))
- result = Cot(A)
+ result = COT(A)
set_pin_data(IC_OUTPUT, 1, result)
push_data()
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 4ff5fd7e17..a52dc5a69e 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -202,7 +202,7 @@ var/list/mining_overlay_cache = list()
if(severity <= 2) // Now to expose the ore lying under the sand.
spawn(1) // Otherwise most of the ore is lost to the explosion, which makes this rather moot.
for(var/ore in resources)
- var/amount_to_give = rand(Ceiling(resources[ore]/2), resources[ore]) // Should result in at least one piece of ore.
+ var/amount_to_give = rand(CEILING(resources[ore]/2, 1), resources[ore]) // Should result in at least one piece of ore.
for(var/i=1, i <= amount_to_give, i++)
var/oretype = ore_types[ore]
new oretype(src)
diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm
index 66e0e5e0f0..e84b569ff6 100644
--- a/code/modules/mob/language/language.dm
+++ b/code/modules/mob/language/language.dm
@@ -32,7 +32,7 @@
for(var/i = 0;i0;x--)
+ for(var/x = rand(FLOOR(syllable_count/syllable_divisor, 1),syllable_count);x>0;x--)
new_name += pick(syllables)
full_name += " [capitalize(lowertext(new_name))]"
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 01f74ac3b5..baff1fa6d0 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -364,7 +364,7 @@
stop_pulling()
src << "You slipped on [slipped_on]!"
playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
- Weaken(Floor(stun_duration/2))
+ Weaken(FLOOR(stun_duration/2, 1))
return 1
/mob/living/carbon/proc/add_chemical_effect(var/effect, var/magnitude = 1)
diff --git a/code/modules/mob/living/carbon/human/descriptors/_descriptors.dm b/code/modules/mob/living/carbon/human/descriptors/_descriptors.dm
index d2944cc0cb..79e876a985 100644
--- a/code/modules/mob/living/carbon/human/descriptors/_descriptors.dm
+++ b/code/modules/mob/living/carbon/human/descriptors/_descriptors.dm
@@ -34,7 +34,7 @@
chargen_value_descriptors = list()
for(var/i = 1 to LAZYLEN(standalone_value_descriptors))
chargen_value_descriptors[standalone_value_descriptors[i]] = i
- default_value = ceil(LAZYLEN(standalone_value_descriptors) * 0.5)
+ default_value = CEILING(LAZYLEN(standalone_value_descriptors) * 0.5, 1)
..()
/datum/mob_descriptor/proc/get_third_person_message_start(var/datum/gender/my_gender)
@@ -99,10 +99,10 @@
/datum/mob_descriptor/proc/get_comparative_value_string_smaller(var/value, var/datum/gender/my_gender, var/datum/gender/other_gender)
var/maxval = LAZYLEN(comparative_value_descriptors_smaller)
- value = Clamp(ceil(value * maxval), 1, maxval)
+ value = Clamp(CEILING(value * maxval, 1), 1, maxval)
return comparative_value_descriptors_smaller[value]
/datum/mob_descriptor/proc/get_comparative_value_string_larger(var/value, var/datum/gender/my_gender, var/datum/gender/other_gender)
var/maxval = LAZYLEN(comparative_value_descriptors_larger)
- value = Clamp(ceil(value * maxval), 1, maxval)
+ value = Clamp(CEILING(value * maxval, 1), 1, maxval)
return comparative_value_descriptors_larger[value]
diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm
index 9e20d49a44..0c0915aa47 100644
--- a/code/modules/mob/living/carbon/metroid/powers.dm
+++ b/code/modules/mob/living/carbon/metroid/powers.dm
@@ -165,4 +165,4 @@
else
src << "I am not ready to reproduce yet..."
else
- src << "I am not old enough to reproduce yet..."
\ No newline at end of file
+ src << "I am not old enough to reproduce yet..."
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 49f44a9097..b609668e43 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -681,7 +681,7 @@
//Robots take half damage from basic attacks.
/mob/living/silicon/robot/attack_generic(var/mob/user, var/damage, var/attack_message)
- return ..(user,Floor(damage/2),attack_message)
+ return ..(user,FLOOR(damage/2, 1),attack_message)
/mob/living/silicon/robot/proc/allowed(mob/M)
//check if it doesn't require any access at all
diff --git a/code/modules/mob/living/simple_animal/animals/giant_spider.dm b/code/modules/mob/living/simple_animal/animals/giant_spider.dm
index 7fe6744c64..fe68de7927 100644
--- a/code/modules/mob/living/simple_animal/animals/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/animals/giant_spider.dm
@@ -197,9 +197,9 @@ Nurse Family
for(var/I = 1 to spiderling_count)
if(prob(10) && src)
var/mob/living/simple_animal/hostile/giant_spider/swarmling = new swarmling_type(src.loc)
- var/swarm_health = Floor(swarmling.maxHealth * 0.4)
- var/swarm_dam_lower = Floor(melee_damage_lower * 0.4)
- var/swarm_dam_upper = Floor(melee_damage_upper * 0.4)
+ var/swarm_health = FLOOR(swarmling.maxHealth * 0.4, 1)
+ var/swarm_dam_lower = FLOOR(melee_damage_lower * 0.4, 1)
+ var/swarm_dam_upper = FLOOR(melee_damage_upper * 0.4, 1)
swarmling.name = "spiderling"
swarmling.maxHealth = swarm_health
swarmling.health = swarm_health
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/carrier.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/carrier.dm
new file mode 100644
index 0000000000..0d5218030d
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/carrier.dm
@@ -0,0 +1,67 @@
+// Carriers are not too dangerous on their own, but they create more spiders when dying.
+
+/mob/living/simple_mob/animal/giant_spider/carrier
+ desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes."
+ icon_state = "carrier"
+ icon_living = "carrier"
+ icon_dead = "carrier_dead"
+
+ maxHealth = 100
+ health = 100
+
+ melee_damage_lower = 8
+ melee_damage_upper = 25
+
+ poison_per_bite = 3
+ poison_type = "chloralhydrate"
+
+ movement_cooldown = 5
+
+ player_msg = "Upon dying, you will release a swarm of spiderlings or young hunter spiders.
\
+ If a spider emerges, you will be placed in control of it."
+
+ var/spiderling_count = 0
+ var/spiderling_type = /obj/effect/spider/spiderling
+ var/swarmling_type = /mob/living/simple_mob/animal/giant_spider/hunter
+ var/swarmling_faction = "spiders"
+ var/swarmling_prob = 10 // Odds that a spiderling will be a swarmling instead.
+
+/mob/living/simple_mob/animal/giant_spider/carrier/initialize()
+ spiderling_count = rand(5, 10)
+ adjust_scale(1.2)
+ return ..()
+
+/mob/living/simple_mob/animal/giant_spider/carrier/death()
+ visible_message(span("warning", "\The [src]'s abdomen splits as it rolls over, spiderlings crawling from the wound.") )
+ spawn(1)
+ var/list/new_spiders = list()
+ for(var/i = 1 to spiderling_count)
+ if(prob(swarmling_prob) && src)
+ var/mob/living/simple_mob/animal/giant_spider/swarmling = new swarmling_type(src.loc)
+ var/swarm_health = FLOOR(swarmling.maxHealth * 0.4, 1)
+ var/swarm_dam_lower = FLOOR(melee_damage_lower * 0.4, 1)
+ var/swarm_dam_upper = FLOOR(melee_damage_upper * 0.4, 1)
+ swarmling.name = "spiderling"
+ swarmling.maxHealth = swarm_health
+ swarmling.health = swarm_health
+ swarmling.melee_damage_lower = swarm_dam_lower
+ swarmling.melee_damage_upper = swarm_dam_upper
+ swarmling.faction = swarmling_faction
+ swarmling.adjust_scale(0.75)
+ new_spiders += swarmling
+ else if(src)
+ var/obj/effect/spider/spiderling/child = new spiderling_type(src.loc)
+ child.skitter()
+ else // We might've gibbed or got deleted.
+ break
+ // Transfer our player to their new body, if RNG provided one.
+ if(new_spiders.len && client)
+ var/mob/living/simple_mob/animal/giant_spider/new_body = pick(new_spiders)
+ new_body.key = src.key
+ return ..()
+
+/mob/living/simple_mob/animal/giant_spider/carrier/recursive
+ desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes. \
+ You have a distinctly bad feeling about this."
+
+ swarmling_type = /mob/living/simple_mob/animal/giant_spider/carrier/recursive
\ No newline at end of file
diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm
index 371c64e0ab..203664e51a 100644
--- a/code/modules/organs/organ_icon.dm
+++ b/code/modules/organs/organ_icon.dm
@@ -289,5 +289,5 @@ var/list/robot_hud_colours = list("#CFCFCF","#AFAFAF","#8F8F8F","#6F6F6F","#4F4F
dam_state = min_dam_state
// Apply colour and return product.
var/list/hud_colours = (robotic < ORGAN_ROBOT) ? flesh_hud_colours : robot_hud_colours
- hud_damage_image.color = hud_colours[max(1,min(ceil(dam_state*hud_colours.len),hud_colours.len))]
+ hud_damage_image.color = hud_colours[max(1,min(CEILING(dam_state*hud_colours.len, 1),hud_colours.len))]
return hud_damage_image
diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm
index b1f58b0965..d626e6f04b 100644
--- a/code/modules/paperwork/papershredder.dm
+++ b/code/modules/paperwork/papershredder.dm
@@ -137,7 +137,7 @@
else
icon_state = "shredder-off"
// Fullness overlay
- overlays += "shredder-[max(0,min(5,Floor(paperamount/max_paper*5)))]"
+ overlays += "shredder-[max(0,min(5,FLOOR(paperamount/max_paper*5, 1)))]"
if (panel_open)
overlays += "panel_open"
diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm
index b8c99636f6..423612d257 100644
--- a/code/modules/planet/sif.dm
+++ b/code/modules/planet/sif.dm
@@ -70,12 +70,12 @@ var/datum/planet/sif/planet_sif = null
high_color = "#FFFFFF"
min = 0.70
- var/lerp_weight = (abs(min - sun_position)) * 4
+ var/interpolate_weight = (abs(min - sun_position)) * 4
var/weather_light_modifier = 1
if(weather_holder && weather_holder.current_weather)
weather_light_modifier = weather_holder.current_weather.light_modifier
- var/new_brightness = (Interpolate(low_brightness, high_brightness, weight = lerp_weight) ) * weather_light_modifier
+ var/new_brightness = (LERP(low_brightness, high_brightness, interpolate_weight) ) * weather_light_modifier
var/new_color = null
if(weather_holder && weather_holder.current_weather && weather_holder.current_weather.light_color)
@@ -91,9 +91,9 @@ var/datum/planet/sif/planet_sif = null
var/high_g = high_color_list[2]
var/high_b = high_color_list[3]
- var/new_r = Interpolate(low_r, high_r, weight = lerp_weight)
- var/new_g = Interpolate(low_g, high_g, weight = lerp_weight)
- var/new_b = Interpolate(low_b, high_b, weight = lerp_weight)
+ var/new_r = LERP(low_r, high_r, interpolate_weight)
+ var/new_g = LERP(low_g, high_g, interpolate_weight)
+ var/new_b = LERP(low_b, high_b, interpolate_weight)
new_color = rgb(new_r, new_g, new_b)
diff --git a/code/modules/planet/time.dm b/code/modules/planet/time.dm
index 0b3008b668..d9c6642e6a 100644
--- a/code/modules/planet/time.dm
+++ b/code/modules/planet/time.dm
@@ -54,15 +54,15 @@
var/seconds = remaining_hour % seconds_in_minute / 10
- var/hour_text = num2text(Floor(hours))
+ var/hour_text = num2text(FLOOR(hours, 1))
if(length(hour_text) < 2)
hour_text = "0[hour_text]" // Add padding if needed, to look more like time2text().
- var/minute_text = num2text(Floor(minutes))
+ var/minute_text = num2text(FLOOR(minutes, 1))
if(length(minute_text) < 2)
minute_text = "0[minute_text]"
- var/second_text = num2text(Floor(seconds))
+ var/second_text = num2text(FLOOR(seconds, 1))
if(length(second_text) < 2)
second_text = "0[second_text]"
diff --git a/code/modules/planet/weather.dm b/code/modules/planet/weather.dm
index a13cb87cc7..541a023c4f 100644
--- a/code/modules/planet/weather.dm
+++ b/code/modules/planet/weather.dm
@@ -98,7 +98,7 @@
visuals.icon_state = current_weather.icon_state
/datum/weather_holder/proc/update_temperature()
- temperature = Interpolate(current_weather.temp_low, current_weather.temp_high, weight = our_planet.sun_position)
+ temperature = LERP(current_weather.temp_low, current_weather.temp_high, our_planet.sun_position)
our_planet.needs_work |= PLANET_PROCESS_TEMP
/datum/weather_holder/proc/get_weather_datum(desired_type)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 6717edf95d..0ec17ef303 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -532,7 +532,7 @@ obj/structure/cable/proc/cableColor(var/colorC)
if(!S || S.robotic < ORGAN_ROBOT || S.open == 3)
return ..()
- var/use_amt = min(src.amount, ceil(S.burn_dam/5), 5)
+ var/use_amt = min(src.amount, CEILING(S.burn_dam/5, 1), 5)
if(can_use(use_amt))
if(S.robo_repair(5*use_amt, BURN, "some damaged wiring", src, user))
src.use(use_amt)
diff --git a/code/modules/power/fusion/core/core_field.dm b/code/modules/power/fusion/core/core_field.dm
index f5d85fb4bf..0dbf5af7e0 100644
--- a/code/modules/power/fusion/core/core_field.dm
+++ b/code/modules/power/fusion/core/core_field.dm
@@ -171,8 +171,8 @@
use_power = light_max_power
else
var/temp_mod = ((plasma_temperature-5000)/20000)
- use_range = light_min_range + ceil((light_max_range-light_min_range)*temp_mod)
- use_power = light_min_power + ceil((light_max_power-light_min_power)*temp_mod)
+ use_range = light_min_range + CEILING((light_max_range-light_min_range)*temp_mod, 1)
+ use_power = light_min_power + CEILING((light_max_power-light_min_power)*temp_mod, 1)
if(last_range != use_range || last_power != use_power)
set_light(use_range,use_power)
@@ -318,8 +318,8 @@
/obj/effect/fusion_em_field/proc/Radiate()
if(istype(loc, /turf))
- var/empsev = max(1, min(3, ceil(size/2)))
- for(var/atom/movable/AM in range(max(1,Floor(size/2)), loc))
+ var/empsev = max(1, min(3, CEILING(size/2, 1)))
+ for(var/atom/movable/AM in range(max(1,FLOOR(size/2, 1)), loc))
if(AM == src || AM == owned_core || !AM.simulated)
continue
@@ -386,7 +386,7 @@
//determine a random amount to actually react this cycle, and remove it from the standard pool
//this is a hack, and quite nonrealistic :(
for(var/reactant in react_pool)
- react_pool[reactant] = rand(Floor(react_pool[reactant]/2),react_pool[reactant])
+ react_pool[reactant] = rand(FLOOR(react_pool[reactant]/2, 1),react_pool[reactant])
dormant_reactant_quantities[reactant] -= react_pool[reactant]
if(!react_pool[reactant])
react_pool -= reactant
@@ -574,7 +574,7 @@
/obj/effect/fusion_em_field/proc/Rupture()
visible_message("\The [src] shudders like a dying animal before flaring to eye-searing brightness and rupturing!")
set_light(15, 15, "#CCCCFF")
- empulse(get_turf(src), ceil(plasma_temperature/1000), ceil(plasma_temperature/300))
+ empulse(get_turf(src), CEILING(plasma_temperature/1000, 1), CEILING(plasma_temperature/300, 1))
global_announcer.autosay("WARNING: FIELD RUPTURE IMMINENT!", "Containment Monitor")
RadiateAll()
var/list/things_in_range = range(10, owned_core)
@@ -584,7 +584,7 @@
turfs_in_range.Add(T)
explosion(pick(things_in_range), -1, 5, 5, 5)
- empulse(pick(things_in_range), ceil(plasma_temperature/1000), ceil(plasma_temperature/300))
+ empulse(pick(things_in_range), CEILING(plasma_temperature/1000, 1), CEILING(plasma_temperature/300, 1))
spawn(25)
explosion(pick(things_in_range), -1, 5, 5, 5)
spawn(25)
@@ -655,7 +655,7 @@
/obj/effect/fusion_em_field/proc/BluespaceQuenchEvent() //!!FUN!! causes a number of explosions in an area around the core. Will likely destory or heavily damage the reactor.
visible_message("\The [src] shudders like a dying animal before flaring to eye-searing brightness and rupturing!")
set_light(15, 15, "#CCCCFF")
- empulse(get_turf(src), ceil(plasma_temperature/1000), ceil(plasma_temperature/300))
+ empulse(get_turf(src), CEILING(plasma_temperature/1000, 1), CEILING(plasma_temperature/300, 1))
global_announcer.autosay("WARNING: FIELD RUPTURE IMMINENT!", "Containment Monitor")
RadiateAll()
var/list/things_in_range = range(10, owned_core)
@@ -665,7 +665,7 @@
turfs_in_range.Add(T)
for(var/loopcount = 1 to 10)
explosion(pick(things_in_range), -1, 5, 5, 5)
- empulse(pick(things_in_range), ceil(plasma_temperature/1000), ceil(plasma_temperature/300))
+ empulse(pick(things_in_range), CEILING(plasma_temperature/1000, 1), CEILING(plasma_temperature/300, 1))
Destroy()
owned_core.Shutdown()
return
diff --git a/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm b/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm
index 29d9362015..26537f2bbc 100644
--- a/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm
+++ b/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm
@@ -46,7 +46,7 @@
return PROCESS_KILL
if(istype(loc, /turf))
- radiation_repository.radiate(src, max(1,ceil(radioactivity/30)))
+ radiation_repository.radiate(src, max(1,CEILING(radioactivity/30, 1)))
/obj/item/weapon/fuel_assembly/Destroy()
processing_objects -= src
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index ac4401387a..ee9e7057da 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -207,7 +207,7 @@
return
if(istype(W, /obj/item/stack/material) && W.get_material_name() == DEFAULT_WALL_MATERIAL)
- var/amt = Ceiling(( initial(integrity) - integrity)/10)
+ var/amt = CEILING(( initial(integrity) - integrity)/10, 1)
if(!amt)
to_chat(user, "\The [src] is already fully repaired.")
return
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 40dbaf0650..7b436449e1 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -618,7 +618,7 @@
if(one_handed_penalty)
if(!held_twohanded)
- acc_mod += -ceil(one_handed_penalty/2)
+ acc_mod += -CEILING(one_handed_penalty/2, 1)
disp_mod += one_handed_penalty*0.5 //dispersion per point of two-handedness
//Accuracy modifiers
diff --git a/code/modules/random_map/noise/noise.dm b/code/modules/random_map/noise/noise.dm
index 7e4323158e..8e45a21c3f 100644
--- a/code/modules/random_map/noise/noise.dm
+++ b/code/modules/random_map/noise/noise.dm
@@ -19,10 +19,10 @@
/datum/random_map/noise/set_map_size()
// Make sure the grid is a square with limits that are
// (n^2)+1, otherwise diamond-square won't work.
- if(!IsPowerOfTwo((limit_x-1)))
- limit_x = RoundUpToPowerOfTwo(limit_x) + 1
- if(!IsPowerOfTwo((limit_y-1)))
- limit_y = RoundUpToPowerOfTwo(limit_y) + 1
+ if(!ISPOWEROFTWO((limit_x-1)))
+ limit_x = ROUNDUPTOPOWEROFTWO(limit_x) + 1
+ if(!ISPOWEROFTWO((limit_y-1)))
+ limit_y = ROUNDUPTOPOWEROFTWO(limit_y) + 1
// Sides must be identical lengths.
if(limit_x > limit_y)
limit_y = limit_x
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
index e3c087b5fa..3f655d83de 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
@@ -70,7 +70,7 @@
/datum/reagent/toxin/hydrophoron/touch_turf(var/turf/simulated/T)
if(!istype(T))
return
- T.assume_gas("phoron", ceil(volume/2), T20C)
+ T.assume_gas("phoron", CEILING(volume/2, 1), T20C)
for(var/turf/simulated/floor/target_tile in range(0,T))
target_tile.assume_gas("phoron", volume/2, 400+T0C)
spawn (0) target_tile.hotspot_expose(700, 400)
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index b870a55902..e6bb3260b9 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -100,7 +100,7 @@
user.setClickCooldown(user.get_attack_speed(src)) //puts a limit on how fast people can eat/drink things
self_feed_message(user)
- reagents.trans_to_mob(user, issmall(user) ? ceil(amount_per_transfer_from_this/2) : amount_per_transfer_from_this, CHEM_INGEST)
+ reagents.trans_to_mob(user, issmall(user) ? CEILING(amount_per_transfer_from_this/2, 1) : amount_per_transfer_from_this, CHEM_INGEST)
feed_sound(user)
return 1
else
diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm
index 519edcea07..475192bc38 100644
--- a/code/modules/shieldgen/directional_shield.dm
+++ b/code/modules/shieldgen/directional_shield.dm
@@ -152,7 +152,7 @@
// Makes shields become gradually more red as the projector's health decreases.
/obj/item/shield_projector/proc/update_shield_colors()
// This is done at the projector instead of the shields themselves to avoid needing to calculate this more than once every update.
- var/lerp_weight = shield_health / max_shield_health
+ var/interpolate_weight = shield_health / max_shield_health
var/list/low_color_list = hex2rgb(low_color)
var/low_r = low_color_list[1]
@@ -164,9 +164,9 @@
var/high_g = high_color_list[2]
var/high_b = high_color_list[3]
- var/new_r = Interpolate(low_r, high_r, weight = lerp_weight)
- var/new_g = Interpolate(low_g, high_g, weight = lerp_weight)
- var/new_b = Interpolate(low_b, high_b, weight = lerp_weight)
+ var/new_r = LERP(low_r, high_r, interpolate_weight)
+ var/new_g = LERP(low_g, high_g, interpolate_weight)
+ var/new_b = LERP(low_b, high_b, interpolate_weight)
var/new_color = rgb(new_r, new_g, new_b)
diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm
index c6233d48a0..0beac59051 100644
--- a/code/modules/shuttles/shuttles_web.dm
+++ b/code/modules/shuttles/shuttles_web.dm
@@ -88,7 +88,7 @@
if(autopilot_delay % 10 == 0) // Every ten ticks.
var/seconds_left = autopilot_delay * 2
if(seconds_left >= 60) // A minute
- var/minutes_left = Floor(seconds_left / 60)
+ var/minutes_left = FLOOR(seconds_left / 60, 1)
seconds_left = seconds_left % 60
autopilot_say("Departing in [minutes_left] minute\s[seconds_left ? ", [seconds_left] seconds":""].")
else
diff --git a/code/modules/turbolift/turbolift_map.dm b/code/modules/turbolift/turbolift_map.dm
index 8614f0df85..a5d1e9f4ed 100644
--- a/code/modules/turbolift/turbolift_map.dm
+++ b/code/modules/turbolift/turbolift_map.dm
@@ -59,8 +59,13 @@
if(NORTH)
+<<<<<<< HEAD
int_panel_x = ux + Floor(lift_size_x/2)
int_panel_y = uy + (make_walls ? 1 : 0)
+=======
+ int_panel_x = ux + FLOOR(lift_size_x/2, 1)
+ int_panel_y = uy + 1
+>>>>>>> 8da11c1... Makes math helpers defines for performance (#5654)
ext_panel_x = ux
ext_panel_y = ey + 2
@@ -76,8 +81,13 @@
if(SOUTH)
+<<<<<<< HEAD
int_panel_x = ux + Floor(lift_size_x/2)
int_panel_y = ey - (make_walls ? 1 : 0)
+=======
+ int_panel_x = ux + FLOOR(lift_size_x/2, 1)
+ int_panel_y = ey - 1
+>>>>>>> 8da11c1... Makes math helpers defines for performance (#5654)
ext_panel_x = ex
ext_panel_y = uy - 2
@@ -93,8 +103,13 @@
if(EAST)
+<<<<<<< HEAD
int_panel_x = ux + (make_walls ? 1 : 0)
int_panel_y = uy + Floor(lift_size_y/2)
+=======
+ int_panel_x = ux+1
+ int_panel_y = uy + FLOOR(lift_size_y/2, 1)
+>>>>>>> 8da11c1... Makes math helpers defines for performance (#5654)
ext_panel_x = ex+2
ext_panel_y = ey
@@ -110,8 +125,13 @@
if(WEST)
+<<<<<<< HEAD
int_panel_x = ex - (make_walls ? 1 : 0)
int_panel_y = uy + Floor(lift_size_y/2)
+=======
+ int_panel_x = ex-1
+ int_panel_y = uy + FLOOR(lift_size_y/2, 1)
+>>>>>>> 8da11c1... Makes math helpers defines for performance (#5654)
ext_panel_x = ux-2
ext_panel_y = uy
diff --git a/vorestation.dme b/vorestation.dme
index ebbe11cd2d..233807ead0 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -93,8 +93,11 @@
#include "code\_helpers\icons_vr.dm"
#include "code\_helpers\lists.dm"
#include "code\_helpers\logging.dm"
+<<<<<<< HEAD:vorestation.dme
#include "code\_helpers\logging_vr.dm"
#include "code\_helpers\maths.dm"
+=======
+>>>>>>> 8da11c1... Makes math helpers defines for performance (#5654):polaris.dme
#include "code\_helpers\matrices.dm"
#include "code\_helpers\mobs.dm"
#include "code\_helpers\names.dm"