181 lines
4.9 KiB
Lua
181 lines
4.9 KiB
Lua
Cartomancer = {}
|
|
|
|
Cartomancer.SETTINGS = {}
|
|
|
|
Cartomancer.nfs = require "cartomancer.nfs"
|
|
local lovely = require "lovely"
|
|
|
|
Cartomancer.INTERNAL_debugging = not not love.filesystem.getInfo('cartomancer_debugging')
|
|
|
|
Cartomancer.use_smods = function ()
|
|
return SMODS and not (MODDED_VERSION == "0.9.8-STEAMODDED")
|
|
end
|
|
|
|
|
|
Cartomancer.find_self = function (target_filename)
|
|
local mods_path = lovely.mod_dir
|
|
|
|
local mod_folders = Cartomancer.nfs.getDirectoryItems(mods_path)
|
|
for _, folder in pairs(mod_folders) do
|
|
local path = string.format('%s/%s', mods_path, folder)
|
|
local files = Cartomancer.nfs.getDirectoryItems(path)
|
|
|
|
for _, filename in pairs(files) do
|
|
if filename == target_filename then
|
|
return path
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
Cartomancer.load_mod_file = function (path, name, as_txt)
|
|
name = name or path
|
|
|
|
local file, err = Cartomancer.nfs.read(Cartomancer.path..'/'..path)
|
|
|
|
assert(file, string.format([=[[Cartomancer] Failed to load mod file %s (%s).:
|
|
%s
|
|
|
|
Get latest release here: https://github.com/stupxd/Cartomancer/releases ]=], path, name, tostring(err)))
|
|
|
|
return as_txt and file or load(file, string.format(" Cartomancer - %s ", name))()
|
|
end
|
|
|
|
Cartomancer.log = function (msg)
|
|
if Cartomancer.INTERNAL_debugging then
|
|
local msg = type(msg) == "string" and msg or Cartomancer.dump(msg)
|
|
|
|
print("[Cartomancer] "..msg)
|
|
end
|
|
end
|
|
|
|
Cartomancer.dump = function (o, level, prefix)
|
|
level = level or 1
|
|
prefix = prefix or ' '
|
|
if type(o) == 'table' and level <= 5 then
|
|
local s = '{ \n'
|
|
for k, v in pairs(o) do
|
|
local format
|
|
if type(k) == 'number' then
|
|
format = '%s[%d] = %s,\n'
|
|
else
|
|
format = '%s["%s"] = %s,\n'
|
|
end
|
|
s = s .. string.format(
|
|
format,
|
|
prefix,
|
|
k,
|
|
-- Compact parent & draw_major to avoid recursion and huge dumps.
|
|
(k == 'parent' or k == 'draw_major') and string.format("'%s'", tostring(v)) or Cartomancer.dump(v, level + 1, prefix..' ')
|
|
)
|
|
end
|
|
return s..prefix:sub(3)..'}'
|
|
else
|
|
if type(o) == "string" then
|
|
return string.format('"%s"', o)
|
|
end
|
|
|
|
if type(o) == "function" or type(o) == "table" then
|
|
return string.format("'%s'", tostring(o))
|
|
end
|
|
|
|
return tostring(o)
|
|
end
|
|
end
|
|
|
|
Cartomancer.table_join_keys = function (tab_, separator)
|
|
local separator = separator or ""
|
|
local inline
|
|
for k, _ in pairs(tab_) do
|
|
inline = (inline and inline..separator or "") .. k
|
|
end
|
|
|
|
return inline or "[empty]"
|
|
end
|
|
|
|
Cartomancer.empty_table = {}
|
|
|
|
Cartomancer.remove_empty_tables = function (list)
|
|
local result = {}
|
|
for _, v in ipairs(list) do
|
|
if v ~= Cartomancer.empty_table then
|
|
result[#result+1] = v
|
|
end
|
|
end
|
|
|
|
return result
|
|
end
|
|
|
|
Cartomancer.do_nothing = function (...) end
|
|
|
|
Cartomancer.align_object = function (o)
|
|
o:align_to_major()
|
|
local x = (o.T.x)
|
|
local y = (o.T.y)
|
|
local w = (o.T.w)
|
|
local h = (o.T.h)
|
|
Moveable.hard_set_T(o,x, y, w, h)
|
|
o:hard_set_T(x, y, w, h)
|
|
end
|
|
|
|
function Cartomancer.basen(n,b)
|
|
n = math.floor(n)
|
|
if not b or b == 10 then return tostring(n) end
|
|
local digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
local t = {}
|
|
local sign = ""
|
|
if n < 0 then
|
|
sign = "-"
|
|
n = -n
|
|
end
|
|
repeat
|
|
local d = (n % b) + 1
|
|
n = math.floor(n / b)
|
|
table.insert(t, 1, digits:sub(d,d))
|
|
until n == 0
|
|
return sign .. table.concat(t,"")
|
|
end
|
|
|
|
local function is_valid_hex(letter)
|
|
local byte_val = string.byte(string.upper(letter))
|
|
-- Between A-F or 0-9
|
|
return byte_val >= 65 and byte_val <= 70 or byte_val >= 48 and byte_val <= 57
|
|
end
|
|
|
|
function Cartomancer.hex_to_color(hex)
|
|
-- Make sure string length is always 8
|
|
while #hex < 8 do
|
|
hex = hex.."F"
|
|
end
|
|
hex = string.sub(hex, 1, 8)
|
|
-- Make sure string only contains
|
|
for i = 1, #hex do
|
|
if not is_valid_hex(hex:sub(i,i)) then
|
|
-- insane way to replace char at given index
|
|
hex = ("%sF%s"):format(hex:sub(1,i-1), hex:sub(i+1))
|
|
end
|
|
end
|
|
local _,_,r,g,b,a = hex:find('(%x%x)(%x%x)(%x%x)(%x%x)')
|
|
local color = {tonumber(r,16)/255,tonumber(g,16)/255,tonumber(b,16)/255,tonumber(a,16)/255 or 255}
|
|
|
|
return color
|
|
end
|
|
|
|
function Cartomancer.color_to_hex(color)
|
|
local hex = ""
|
|
for i = 1, 3 do
|
|
local base_16 = Cartomancer.basen(color[i] * 255, 16)
|
|
-- Numbers below 16 need 0 in front
|
|
if #base_16 == 1 then
|
|
base_16 = "0"..base_16
|
|
end
|
|
-- How would we ever get numbers above 255 :3c
|
|
base_16 = base_16:sub(#base_16 - 1, #base_16)
|
|
|
|
hex = hex .. base_16
|
|
end
|
|
|
|
return hex
|
|
end
|
|
|
|
return Cartomancer |