diff --git a/autogen/lua_constants/built-in.lua b/autogen/lua_constants/built-in.lua index 7f94e8f73..3e91cdac9 100644 --- a/autogen/lua_constants/built-in.lua +++ b/autogen/lua_constants/built-in.lua @@ -169,6 +169,136 @@ function network_player_get_override_palette_color(np, part) return color end +-------------------------- +-- local math functions -- +-------------------------- +local __math_min, __math_max, __math_sqrt, __math_floor, __math_ceil, __math_cos, __math_sin, __math_pi = math.min, math.max, math.sqrt, math.floor, math.ceil, math.cos, math.sin, math.pi + +------------ +-- tweens -- +------------ +-- Unrelated to SM64, but these are for `math.tween` + +---@param x number +---@return number +IN_SINE = function (x) return 1 - __math_cos((x * __math_pi) / 2) end +---@param x number +---@return number +OUT_SINE = function (x) return __math_sin((x * __math_pi) / 2) end +---@param x number +---@return number +IN_OUT_SINE = function (x) return -(__math_cos(__math_pi * x) - 1) / 2 end +---@param x number +---@return number +OUT_IN_SINE = function (x) return x < 0.5 and 0.5 * __math_sin(x * __math_pi) or 1 - 0.5 * __math_cos(((x * 2 - 1) * (__math_pi / 2))) end +---@param x number +---@return number +IN_QUAD = function (x) return x ^ 2 end +---@param x number +---@return number +OUT_QUAD = function (x) return 1 - ((1 - x) ^ 2) end +---@param x number +---@return number +IN_OUT_QUAD = function (x) return x < 0.5 and 2 * (x ^ 2) or 1 - ((-2 * x + 2) ^ 2) / 2 end +---@param x number +---@return number +OUT_IN_QUAD = function (x) return x < 0.5 and 0.5 * (-(2 * x) * ((2 * x) - 2)) or 0.5 + 0.5 * (2 * x - 1) ^ 2 end +---@param x number +---@return number +IN_CUBIC = function (x) return x ^ 3 end +---@param x number +---@return number +OUT_CUBIC = function (x) return 1 - ((1 - x) ^ 3) end +---@param x number +---@return number +IN_OUT_CUBIC = function (x) return x < 0.5 and 4 * (x ^ 3) or 1 - ((-2 * x + 2) ^ 3) / 2 end +---@param x number +---@return number +OUT_IN_CUBIC = function (x) return x < 0.5 and 0.5 * (((2 * x - 1) ^ 3) + 1) or 0.5 + 0.5 * (2 * x - 1) ^ 3 end +---@param x number +---@return number +IN_QUART = function (x) return x ^ 4 end +---@param x number +---@return number +OUT_QUART = function (x) return 1 - ((1 - x) ^ 4) end +---@param x number +---@return number +IN_OUT_QUART = function (x) return x < 0.5 and 8 * (x ^ 4) or 1 - ((-2 * x + 2) ^ 4) / 2 end +---@param x number +---@return number +OUT_IN_QUART = function (x) return x < 0.5 and 0.5 * (1 - ((2 * x - 1) ^ 4)) or 0.5 + 0.5 * (2 * x - 1) ^ 4 end +---@param x number +---@return number +IN_QUINT = function (x) return x ^ 5 end +---@param x number +---@return number +OUT_QUINT = function (x) return 1 - ((1 - x) ^ 5) end +---@param x number +---@return number +IN_OUT_QUINT = function (x) return x < 0.5 and 16 * (x ^ 5) or 1 - ((-2 * x + 2) ^ 5) / 2 end +---@param x number +---@return number +OUT_IN_QUINT = function (x) return x < 0.5 and 0.5 * (((2 * x - 1) ^ 5) + 1) or 0.5 + 0.5 * (2 * x - 1) ^ 5 end +---@param x number +---@return number +IN_EXPO = function (x) return x == 0 and x or 2 ^ (10 * x - 10) end +---@param x number +---@return number +OUT_EXPO = function (x) return x == 1 and x or 1 - (2 ^ (-10 * x)) end +---@param x number +---@return number +IN_OUT_EXPO = function (x) return (x == 0 or x == 1) and x or x < 0.5 and (2 ^ (20 * x - 10)) / 2 or (2 - (2 ^ (-20 * x + 10))) / 2 end +---@param x number +---@return number +OUT_IN_EXPO = function (x) return (x == 0 or x == 1) and x or x < 0.5 and 0.5 * (1 - 2 ^ (-20 * x)) or 0.5 + 0.5 * (2 ^ (20 * x - 20)) end +---@param x number +---@return number +IN_CIRC = function (x) return 1 - __math_sqrt(1 - (x ^ 2)) end +---@param x number +---@return number +OUT_CIRC = function (x) return __math_sqrt(1 - ((x - 1) ^ 2)) end +---@param x number +---@return number +IN_OUT_CIRC = function (x) return x < 0.5 and (1 - __math_sqrt(1 - ((2 * x) ^ 2))) / 2 or (__math_sqrt(1 - ((-2 * x + 2) ^ 2)) + 1) / 2 end +---@param x number +---@return number +OUT_IN_CIRC = function (x) return x < 0.5 and 0.5 * __math_sqrt(1 - (2 * x - 1) ^ 2) or 0.5 + 0.5 * (1 - __math_sqrt(1 - (2 * x - 1) ^ 2)) end +---@param x number +---@return number +IN_BACK = function (x) return (1.70158 + 1) * (x ^ 3) - 1.70158 * (x ^ 2) end +---@param x number +---@return number +OUT_BACK = function (x) return 1 + (1.70158 + 1) * ((x - 1) ^ 3) + 1.70158 * ((x - 1) ^ 2) end +---@param x number +---@return number +IN_OUT_BACK = function (x) return x < 0.5 and (((2 * x) ^ 2) * (((1.70158 * 1.525) + 1) * 2 * x - (1.70158 * 1.525))) / 2 or (((2 * x - 2) ^ 2) * (((1.70158 * 1.525) + 1) * (x * 2 - 2) + (1.70158 * 1.525)) + 2) / 2 end +---@param x number +---@return number +OUT_IN_BACK = function (x) return x < 0.5 and 0.5 * (1 + (1.70158 + 1) * ((2 * x) - 1) ^ 3 + 1.70158 * ((2 * x) - 1) ^ 2) or 0.5 + 0.5 * ((1.70158 + 1) * (2 * x - 1) ^ 3 - 1.70158 * (2 * x - 1) ^ 2) end +---@param x number +---@return number +IN_ELASTIC = function (x) return (x == 0 or x == 1) and x or -(2 ^ (10 * x - 10)) * __math_sin((x * 10 - 10.75) * ((2 * __math_pi) / 3)) end +---@param x number +---@return number +OUT_ELASTIC = function (x) return (x == 0 or x == 1) and x or (2 ^ (-10 * x)) * __math_sin((x * 10 - 0.75) * ((2 * __math_pi) / 3)) + 1 end +---@param x number +---@return number +IN_OUT_ELASTIC = function (x) return (x == 0 or x == 1) and x or (x < 0.5 and (-0.5 * (2 ^ (20 * x - 10)) * __math_sin((20 * x - 11.125) * ((2 * __math_pi) / 4.5)))) or (0.5 * (2 ^ (-20 * x + 10)) * __math_sin((20 * x - 11.125) * ((2 * __math_pi) / 4.5)) + 1) end +---@param x number +---@return number +OUT_IN_ELASTIC = function (x) return (x == 0 or x == 1) and x or (x < 0.5 and 0.5 * ((2 ^ (-10 * (x * 2))) * __math_sin(((x * 2) * 10 - 0.75) * ((2 * __math_pi) / 3)) + 1)) or 0.5 + 0.5 * (-(2 ^ (10 * ((x - 0.5) * 2) - 10)) * __math_sin((((x - 0.5) * 2) * 10 - 10.75) * ((2 * __math_pi) / 3))) end +---@param x number +---@return number +IN_BOUNCE = function (x) return 1 - OUT_BOUNCE(1 - x) end +---@param x number +---@return number +OUT_BOUNCE = function (x) if x < 1 / 2.75 then return 7.5625 * (x ^ 2) elseif x < 2 / 2.75 then x = x - 1.5 / 2.75 return 7.5625 * (x ^ 2) + 0.75 elseif x < 2.5 / 2.75 then x = x - 2.25 / 2.75 return 7.5625 * (x ^ 2) + 0.9375 else x = x - 2.625 / 2.75 return 7.5625 * (x ^ 2) + 0.984375 end end +---@param x number +---@return number +IN_OUT_BOUNCE = function (x) return x < 0.5 and (1 - OUT_BOUNCE(1 - 2 * x)) / 2 or (1 + OUT_BOUNCE(2 * x - 1)) / 2 end +---@param x number +---@return number +OUT_IN_BOUNCE = function (x) return x < 0.5 and 0.5 * OUT_BOUNCE(x * 2) or 0.5 + 0.5 * IN_BOUNCE(2 * x - 1) end -------------------- -- math functions -- @@ -176,8 +306,6 @@ end --- Note: These functions don't exist in the Lua math library, --- and are useful enough to not have to redefine them in every mod -local __math_min, __math_max, __math_sqrt, __math_floor, __math_ceil = math.min, math.max, math.sqrt, math.floor, math.ceil - --- @param x number --- @return number --- Computes the square of the number `x` @@ -251,6 +379,24 @@ function math.round(x) return x > 0 and __math_floor(x + 0.5) or __math_ceil(x - 0.5) end +--- @param t function | number +--- @param a number +--- @param b number +--- @param x number +--- @return number +--- Interpolates between `a` and `b` using delta `x` and a tweening or easing math function `t` +function math.tween(t, a, b, x) + local y + + if type(t) == 'function' then + y = a + t(x) * (b - a) + else + y = a + t * (b - a) + end + + return y +end + local __common_signed_conversion = function (x, size) x = __math_floor(x) & (1 << size) - 1 return x - ((x & (1 << (size - 1))) << 1) @@ -301,4 +447,4 @@ end --- - `[0, 4294967295]` function math.u32(x) return __common_unsigned_conversion(x, 32) -end \ No newline at end of file +end diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua index b7dd22663..285ebe9fb 100644 --- a/autogen/lua_definitions/constants.lua +++ b/autogen/lua_definitions/constants.lua @@ -171,6 +171,136 @@ function network_player_get_override_palette_color(np, part) return color end +-------------------------- +-- local math functions -- +-------------------------- +local __math_min, __math_max, __math_sqrt, __math_floor, __math_ceil, __math_cos, __math_sin, __math_pi = math.min, math.max, math.sqrt, math.floor, math.ceil, math.cos, math.sin, math.pi + +------------ +-- tweens -- +------------ +-- Unrelated to SM64, but these are for `math.tween` + +---@param x number +---@return number +IN_SINE = function (x) return 1 - __math_cos((x * __math_pi) / 2) end +---@param x number +---@return number +OUT_SINE = function (x) return __math_sin((x * __math_pi) / 2) end +---@param x number +---@return number +IN_OUT_SINE = function (x) return -(__math_cos(__math_pi * x) - 1) / 2 end +---@param x number +---@return number +OUT_IN_SINE = function (x) return x < 0.5 and 0.5 * __math_sin(x * __math_pi) or 1 - 0.5 * __math_cos(((x * 2 - 1) * (__math_pi / 2))) end +---@param x number +---@return number +IN_QUAD = function (x) return x ^ 2 end +---@param x number +---@return number +OUT_QUAD = function (x) return 1 - ((1 - x) ^ 2) end +---@param x number +---@return number +IN_OUT_QUAD = function (x) return x < 0.5 and 2 * (x ^ 2) or 1 - ((-2 * x + 2) ^ 2) / 2 end +---@param x number +---@return number +OUT_IN_QUAD = function (x) return x < 0.5 and 0.5 * (-(2 * x) * ((2 * x) - 2)) or 0.5 + 0.5 * (2 * x - 1) ^ 2 end +---@param x number +---@return number +IN_CUBIC = function (x) return x ^ 3 end +---@param x number +---@return number +OUT_CUBIC = function (x) return 1 - ((1 - x) ^ 3) end +---@param x number +---@return number +IN_OUT_CUBIC = function (x) return x < 0.5 and 4 * (x ^ 3) or 1 - ((-2 * x + 2) ^ 3) / 2 end +---@param x number +---@return number +OUT_IN_CUBIC = function (x) return x < 0.5 and 0.5 * (((2 * x - 1) ^ 3) + 1) or 0.5 + 0.5 * (2 * x - 1) ^ 3 end +---@param x number +---@return number +IN_QUART = function (x) return x ^ 4 end +---@param x number +---@return number +OUT_QUART = function (x) return 1 - ((1 - x) ^ 4) end +---@param x number +---@return number +IN_OUT_QUART = function (x) return x < 0.5 and 8 * (x ^ 4) or 1 - ((-2 * x + 2) ^ 4) / 2 end +---@param x number +---@return number +OUT_IN_QUART = function (x) return x < 0.5 and 0.5 * (1 - ((2 * x - 1) ^ 4)) or 0.5 + 0.5 * (2 * x - 1) ^ 4 end +---@param x number +---@return number +IN_QUINT = function (x) return x ^ 5 end +---@param x number +---@return number +OUT_QUINT = function (x) return 1 - ((1 - x) ^ 5) end +---@param x number +---@return number +IN_OUT_QUINT = function (x) return x < 0.5 and 16 * (x ^ 5) or 1 - ((-2 * x + 2) ^ 5) / 2 end +---@param x number +---@return number +OUT_IN_QUINT = function (x) return x < 0.5 and 0.5 * (((2 * x - 1) ^ 5) + 1) or 0.5 + 0.5 * (2 * x - 1) ^ 5 end +---@param x number +---@return number +IN_EXPO = function (x) return x == 0 and x or 2 ^ (10 * x - 10) end +---@param x number +---@return number +OUT_EXPO = function (x) return x == 1 and x or 1 - (2 ^ (-10 * x)) end +---@param x number +---@return number +IN_OUT_EXPO = function (x) return (x == 0 or x == 1) and x or x < 0.5 and (2 ^ (20 * x - 10)) / 2 or (2 - (2 ^ (-20 * x + 10))) / 2 end +---@param x number +---@return number +OUT_IN_EXPO = function (x) return (x == 0 or x == 1) and x or x < 0.5 and 0.5 * (1 - 2 ^ (-20 * x)) or 0.5 + 0.5 * (2 ^ (20 * x - 20)) end +---@param x number +---@return number +IN_CIRC = function (x) return 1 - __math_sqrt(1 - (x ^ 2)) end +---@param x number +---@return number +OUT_CIRC = function (x) return __math_sqrt(1 - ((x - 1) ^ 2)) end +---@param x number +---@return number +IN_OUT_CIRC = function (x) return x < 0.5 and (1 - __math_sqrt(1 - ((2 * x) ^ 2))) / 2 or (__math_sqrt(1 - ((-2 * x + 2) ^ 2)) + 1) / 2 end +---@param x number +---@return number +OUT_IN_CIRC = function (x) return x < 0.5 and 0.5 * __math_sqrt(1 - (2 * x - 1) ^ 2) or 0.5 + 0.5 * (1 - __math_sqrt(1 - (2 * x - 1) ^ 2)) end +---@param x number +---@return number +IN_BACK = function (x) return (1.70158 + 1) * (x ^ 3) - 1.70158 * (x ^ 2) end +---@param x number +---@return number +OUT_BACK = function (x) return 1 + (1.70158 + 1) * ((x - 1) ^ 3) + 1.70158 * ((x - 1) ^ 2) end +---@param x number +---@return number +IN_OUT_BACK = function (x) return x < 0.5 and (((2 * x) ^ 2) * (((1.70158 * 1.525) + 1) * 2 * x - (1.70158 * 1.525))) / 2 or (((2 * x - 2) ^ 2) * (((1.70158 * 1.525) + 1) * (x * 2 - 2) + (1.70158 * 1.525)) + 2) / 2 end +---@param x number +---@return number +OUT_IN_BACK = function (x) return x < 0.5 and 0.5 * (1 + (1.70158 + 1) * ((2 * x) - 1) ^ 3 + 1.70158 * ((2 * x) - 1) ^ 2) or 0.5 + 0.5 * ((1.70158 + 1) * (2 * x - 1) ^ 3 - 1.70158 * (2 * x - 1) ^ 2) end +---@param x number +---@return number +IN_ELASTIC = function (x) return (x == 0 or x == 1) and x or -(2 ^ (10 * x - 10)) * __math_sin((x * 10 - 10.75) * ((2 * __math_pi) / 3)) end +---@param x number +---@return number +OUT_ELASTIC = function (x) return (x == 0 or x == 1) and x or (2 ^ (-10 * x)) * __math_sin((x * 10 - 0.75) * ((2 * __math_pi) / 3)) + 1 end +---@param x number +---@return number +IN_OUT_ELASTIC = function (x) return (x == 0 or x == 1) and x or (x < 0.5 and (-0.5 * (2 ^ (20 * x - 10)) * __math_sin((20 * x - 11.125) * ((2 * __math_pi) / 4.5)))) or (0.5 * (2 ^ (-20 * x + 10)) * __math_sin((20 * x - 11.125) * ((2 * __math_pi) / 4.5)) + 1) end +---@param x number +---@return number +OUT_IN_ELASTIC = function (x) return (x == 0 or x == 1) and x or (x < 0.5 and 0.5 * ((2 ^ (-10 * (x * 2))) * __math_sin(((x * 2) * 10 - 0.75) * ((2 * __math_pi) / 3)) + 1)) or 0.5 + 0.5 * (-(2 ^ (10 * ((x - 0.5) * 2) - 10)) * __math_sin((((x - 0.5) * 2) * 10 - 10.75) * ((2 * __math_pi) / 3))) end +---@param x number +---@return number +IN_BOUNCE = function (x) return 1 - OUT_BOUNCE(1 - x) end +---@param x number +---@return number +OUT_BOUNCE = function (x) if x < 1 / 2.75 then return 7.5625 * (x ^ 2) elseif x < 2 / 2.75 then x = x - 1.5 / 2.75 return 7.5625 * (x ^ 2) + 0.75 elseif x < 2.5 / 2.75 then x = x - 2.25 / 2.75 return 7.5625 * (x ^ 2) + 0.9375 else x = x - 2.625 / 2.75 return 7.5625 * (x ^ 2) + 0.984375 end end +---@param x number +---@return number +IN_OUT_BOUNCE = function (x) return x < 0.5 and (1 - OUT_BOUNCE(1 - 2 * x)) / 2 or (1 + OUT_BOUNCE(2 * x - 1)) / 2 end +---@param x number +---@return number +OUT_IN_BOUNCE = function (x) return x < 0.5 and 0.5 * OUT_BOUNCE(x * 2) or 0.5 + 0.5 * IN_BOUNCE(2 * x - 1) end -------------------- -- math functions -- @@ -178,8 +308,6 @@ end --- Note: These functions don't exist in the Lua math library, --- and are useful enough to not have to redefine them in every mod -local __math_min, __math_max, __math_sqrt, __math_floor, __math_ceil = math.min, math.max, math.sqrt, math.floor, math.ceil - --- @param x number --- @return number --- Computes the square of the number `x` @@ -253,6 +381,24 @@ function math.round(x) return x > 0 and __math_floor(x + 0.5) or __math_ceil(x - 0.5) end +--- @param t function | number +--- @param a number +--- @param b number +--- @param x number +--- @return number +--- Interpolates between `a` and `b` using delta `x` and a tweening or easing math function `t` +function math.tween(t, a, b, x) + local y + + if type(t) == 'function' then + y = a + t(x) * (b - a) + else + y = a + t * (b - a) + end + + return y +end + local __common_signed_conversion = function (x, size) x = __math_floor(x) & (1 << size) - 1 return x - ((x & (1 << (size - 1))) << 1) @@ -306,6 +452,7 @@ function math.u32(x) end + ------------------------- -- vec types constants -- ------------------------- diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c index fa910ab98..10c85cdfb 100644 --- a/src/pc/lua/smlua_constants_autogen.c +++ b/src/pc/lua/smlua_constants_autogen.c @@ -154,12 +154,139 @@ char gSmluaConstants[] = "" "}\n" "return color\n" "end\n" +"--------------------------\n" +"-- local math functions --\n" +"--------------------------\n" +"local __math_min, __math_max, __math_sqrt, __math_floor, __math_ceil, __math_cos, __math_sin, __math_pi = math.min, math.max, math.sqrt, math.floor, math.ceil, math.cos, math.sin, math.pi\n" +"------------\n" +"-- tweens --\n" +"------------\n" +"-- Unrelated to SM64, but these are for `math.tween`\n" +"---@param x number\n" +"---@return number\n" +"IN_SINE = function (x) return 1 - __math_cos((x * __math_pi) / 2) end\n" +"---@param x number\n" +"---@return number\n" +"OUT_SINE = function (x) return __math_sin((x * __math_pi) / 2) end\n" +"---@param x number\n" +"---@return number\n" +"IN_OUT_SINE = function (x) return -(__math_cos(__math_pi * x) - 1) / 2 end\n" +"---@param x number\n" +"---@return number\n" +"OUT_IN_SINE = function (x) return x < 0.5 and 0.5 * __math_sin(x * __math_pi) or 1 - 0.5 * __math_cos(((x * 2 - 1) * (__math_pi / 2))) end\n" +"---@param x number\n" +"---@return number\n" +"IN_QUAD = function (x) return x ^ 2 end\n" +"---@param x number\n" +"---@return number\n" +"OUT_QUAD = function (x) return 1 - ((1 - x) ^ 2) end\n" +"---@param x number\n" +"---@return number\n" +"IN_OUT_QUAD = function (x) return x < 0.5 and 2 * (x ^ 2) or 1 - ((-2 * x + 2) ^ 2) / 2 end\n" +"---@param x number\n" +"---@return number\n" +"OUT_IN_QUAD = function (x) return x < 0.5 and 0.5 * (-(2 * x) * ((2 * x) - 2)) or 0.5 + 0.5 * (2 * x - 1) ^ 2 end\n" +"---@param x number\n" +"---@return number\n" +"IN_CUBIC = function (x) return x ^ 3 end\n" +"---@param x number\n" +"---@return number\n" +"OUT_CUBIC = function (x) return 1 - ((1 - x) ^ 3) end\n" +"---@param x number\n" +"---@return number\n" +"IN_OUT_CUBIC = function (x) return x < 0.5 and 4 * (x ^ 3) or 1 - ((-2 * x + 2) ^ 3) / 2 end\n" +"---@param x number\n" +"---@return number\n" +"OUT_IN_CUBIC = function (x) return x < 0.5 and 0.5 * (((2 * x - 1) ^ 3) + 1) or 0.5 + 0.5 * (2 * x - 1) ^ 3 end\n" +"---@param x number\n" +"---@return number\n" +"IN_QUART = function (x) return x ^ 4 end\n" +"---@param x number\n" +"---@return number\n" +"OUT_QUART = function (x) return 1 - ((1 - x) ^ 4) end\n" +"---@param x number\n" +"---@return number\n" +"IN_OUT_QUART = function (x) return x < 0.5 and 8 * (x ^ 4) or 1 - ((-2 * x + 2) ^ 4) / 2 end\n" +"---@param x number\n" +"---@return number\n" +"OUT_IN_QUART = function (x) return x < 0.5 and 0.5 * (1 - ((2 * x - 1) ^ 4)) or 0.5 + 0.5 * (2 * x - 1) ^ 4 end\n" +"---@param x number\n" +"---@return number\n" +"IN_QUINT = function (x) return x ^ 5 end\n" +"---@param x number\n" +"---@return number\n" +"OUT_QUINT = function (x) return 1 - ((1 - x) ^ 5) end\n" +"---@param x number\n" +"---@return number\n" +"IN_OUT_QUINT = function (x) return x < 0.5 and 16 * (x ^ 5) or 1 - ((-2 * x + 2) ^ 5) / 2 end\n" +"---@param x number\n" +"---@return number\n" +"OUT_IN_QUINT = function (x) return x < 0.5 and 0.5 * (((2 * x - 1) ^ 5) + 1) or 0.5 + 0.5 * (2 * x - 1) ^ 5 end\n" +"---@param x number\n" +"---@return number\n" +"IN_EXPO = function (x) return x == 0 and x or 2 ^ (10 * x - 10) end\n" +"---@param x number\n" +"---@return number\n" +"OUT_EXPO = function (x) return x == 1 and x or 1 - (2 ^ (-10 * x)) end\n" +"---@param x number\n" +"---@return number\n" +"IN_OUT_EXPO = function (x) return (x == 0 or x == 1) and x or x < 0.5 and (2 ^ (20 * x - 10)) / 2 or (2 - (2 ^ (-20 * x + 10))) / 2 end\n" +"---@param x number\n" +"---@return number\n" +"OUT_IN_EXPO = function (x) return (x == 0 or x == 1) and x or x < 0.5 and 0.5 * (1 - 2 ^ (-20 * x)) or 0.5 + 0.5 * (2 ^ (20 * x - 20)) end\n" +"---@param x number\n" +"---@return number\n" +"IN_CIRC = function (x) return 1 - __math_sqrt(1 - (x ^ 2)) end\n" +"---@param x number\n" +"---@return number\n" +"OUT_CIRC = function (x) return __math_sqrt(1 - ((x - 1) ^ 2)) end\n" +"---@param x number\n" +"---@return number\n" +"IN_OUT_CIRC = function (x) return x < 0.5 and (1 - __math_sqrt(1 - ((2 * x) ^ 2))) / 2 or (__math_sqrt(1 - ((-2 * x + 2) ^ 2)) + 1) / 2 end\n" +"---@param x number\n" +"---@return number\n" +"OUT_IN_CIRC = function (x) return x < 0.5 and 0.5 * __math_sqrt(1 - (2 * x - 1) ^ 2) or 0.5 + 0.5 * (1 - __math_sqrt(1 - (2 * x - 1) ^ 2)) end\n" +"---@param x number\n" +"---@return number\n" +"IN_BACK = function (x) return (1.70158 + 1) * (x ^ 3) - 1.70158 * (x ^ 2) end\n" +"---@param x number\n" +"---@return number\n" +"OUT_BACK = function (x) return 1 + (1.70158 + 1) * ((x - 1) ^ 3) + 1.70158 * ((x - 1) ^ 2) end\n" +"---@param x number\n" +"---@return number\n" +"IN_OUT_BACK = function (x) return x < 0.5 and (((2 * x) ^ 2) * (((1.70158 * 1.525) + 1) * 2 * x - (1.70158 * 1.525))) / 2 or (((2 * x - 2) ^ 2) * (((1.70158 * 1.525) + 1) * (x * 2 - 2) + (1.70158 * 1.525)) + 2) / 2 end\n" +"---@param x number\n" +"---@return number\n" +"OUT_IN_BACK = function (x) return x < 0.5 and 0.5 * (1 + (1.70158 + 1) * ((2 * x) - 1) ^ 3 + 1.70158 * ((2 * x) - 1) ^ 2) or 0.5 + 0.5 * ((1.70158 + 1) * (2 * x - 1) ^ 3 - 1.70158 * (2 * x - 1) ^ 2) end\n" +"---@param x number\n" +"---@return number\n" +"IN_ELASTIC = function (x) return (x == 0 or x == 1) and x or -(2 ^ (10 * x - 10)) * __math_sin((x * 10 - 10.75) * ((2 * __math_pi) / 3)) end\n" +"---@param x number\n" +"---@return number\n" +"OUT_ELASTIC = function (x) return (x == 0 or x == 1) and x or (2 ^ (-10 * x)) * __math_sin((x * 10 - 0.75) * ((2 * __math_pi) / 3)) + 1 end\n" +"---@param x number\n" +"---@return number\n" +"IN_OUT_ELASTIC = function (x) return (x == 0 or x == 1) and x or (x < 0.5 and (-0.5 * (2 ^ (20 * x - 10)) * __math_sin((20 * x - 11.125) * ((2 * __math_pi) / 4.5)))) or (0.5 * (2 ^ (-20 * x + 10)) * __math_sin((20 * x - 11.125) * ((2 * __math_pi) / 4.5)) + 1) end\n" +"---@param x number\n" +"---@return number\n" +"OUT_IN_ELASTIC = function (x) return (x == 0 or x == 1) and x or (x < 0.5 and 0.5 * ((2 ^ (-10 * (x * 2))) * __math_sin(((x * 2) * 10 - 0.75) * ((2 * __math_pi) / 3)) + 1)) or 0.5 + 0.5 * (-(2 ^ (10 * ((x - 0.5) * 2) - 10)) * __math_sin((((x - 0.5) * 2) * 10 - 10.75) * ((2 * __math_pi) / 3))) end\n" +"---@param x number\n" +"---@return number\n" +"IN_BOUNCE = function (x) return 1 - OUT_BOUNCE(1 - x) end\n" +"---@param x number\n" +"---@return number\n" +"OUT_BOUNCE = function (x) if x < 1 / 2.75 then return 7.5625 * (x ^ 2) elseif x < 2 / 2.75 then x = x - 1.5 / 2.75 return 7.5625 * (x ^ 2) + 0.75 elseif x < 2.5 / 2.75 then x = x - 2.25 / 2.75 return 7.5625 * (x ^ 2) + 0.9375 else x = x - 2.625 / 2.75 return 7.5625 * (x ^ 2) + 0.984375 end end\n" +"---@param x number\n" +"---@return number\n" +"IN_OUT_BOUNCE = function (x) return x < 0.5 and (1 - OUT_BOUNCE(1 - 2 * x)) / 2 or (1 + OUT_BOUNCE(2 * x - 1)) / 2 end\n" +"---@param x number\n" +"---@return number\n" +"OUT_IN_BOUNCE = function (x) return x < 0.5 and 0.5 * OUT_BOUNCE(x * 2) or 0.5 + 0.5 * IN_BOUNCE(2 * x - 1) end\n" "--------------------\n" "-- math functions --\n" "--------------------\n" "--- Note: These functions don't exist in the Lua math library,\n" "--- and are useful enough to not have to redefine them in every mod\n" -"local __math_min, __math_max, __math_sqrt, __math_floor, __math_ceil = math.min, math.max, math.sqrt, math.floor, math.ceil\n" "--- @param x number\n" "--- @return number\n" "--- Computes the square of the number `x`\n" @@ -224,6 +351,21 @@ char gSmluaConstants[] = "" "function math.round(x)\n" "return x > 0 and __math_floor(x + 0.5) or __math_ceil(x - 0.5)\n" "end\n" +"--- @param t function | number\n" +"--- @param a number\n" +"--- @param b number\n" +"--- @param x number\n" +"--- @return number\n" +"--- Interpolates between `a` and `b` using delta `x` and a tweening or easing math function `t`\n" +"function math.tween(t, a, b, x)\n" +"local y\n" +"if type(t) == 'function' then\n" +"y = a + t(x) * (b - a)\n" +"else\n" +"y = a + t * (b - a)\n" +"end\n" +"return y\n" +"end\n" "local __common_signed_conversion = function (x, size)\n" "x = __math_floor(x) & (1 << size) - 1\n" "return x - ((x & (1 << (size - 1))) << 1)\n"