2024-01-25 03:39:44 +01:00

84 lines
2.5 KiB
Lua

--- Describing things.
-- This module includes functions used for describing things.
-- @module advtrains_doc_integration.describe
-- @alias D
local M = advtrains_doc_integration.mathutils
local utils = advtrains_doc_integration.utils
local D = {}
--- Describe a conns object
-- @tparam advtrains.conns|{advtrains.conns,number,...} conns The conns object to describe.
-- @treturn string|nil The description of the conns object.
function D.conns(conns)
local connsdesc = {[0] = "N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"}
if type(conns) == "table" then
if conns.c then
if conns.y and conns.y ~= 0 then
return ("%s%+d%%"):format(D.conns(conns.c), conns.y*100)
else
return D.conns(conns.c)
end
else
local cst = utils.map(conns, D.conns)
local cstl = #cst
if cstl == 2 then
return ("%s - %s"):format(unpack(cst))
elseif cstl == 3 then
return ("[%s <-] %s -> %s"):format(cst[3], cst[1], cst[2])
elseif cstl == 4 then
return ("%s - %s; %s - %s"):format(unpack(cst))
elseif cstl == 5 then
return ("[%s,%s <-] %s -> %s"):format(cst[3], cst[4], cst[1], cst[2])
end
end
else
return connsdesc[tonumber(conns)]
end
end
--- Describe a (mixed) fraction
-- @tparam integer int The integer part of the number.
-- @tparam integer num The numerator.
-- @tparam integer denom The denominator.
-- @treturn string The description of the mixed fraction.
function D.mixed_fraction(int, num, denom)
local str = tostring(int)
if num > 0 then
local fs = ("%d/%d"):format(num, denom)
if int ~= 0 then
str = ("%d %s"):format(int, fs)
else
str = fs
end
end
return str
end
--- Describe a short length (using mm and in).
-- @tparam number x The length in meters.
-- @treturn string The description of the length.
function D.length(x)
local inch, inchfrac = math.modf(x/0.0254)
local ft = math.floor(inch/12)
inch, inchfrac = inch%12, math.floor(inchfrac*32)
local imst = {}
if ft > 0 then
table.insert(imst, ft .. "'")
end
if inch > 0 or inchfrac > 0 or ft == 0 then
table.insert(imst, D.mixed_fraction(inch, M.reduce_fraction(inchfrac, 32)) .. '"')
end
return ("%d mm (%s)"):format(1000*x, table.concat(imst, " "))
end
--- Describe a speed value (using m/s, km/h and mph).
-- @tparam number x The speed in m/s.
-- @treturn string The description of the speed.
function D.speed(x)
local kmph = x*3.6
local mph = kmph/1.609344
return string.format("%.1f m/s (%.1f km/h; %.1f mph)", x, kmph, mph)
end
return D