307 lines
8.1 KiB
Lua
307 lines
8.1 KiB
Lua
|
|
|
||
|
|
old_newImage = love.graphics.newImage
|
||
|
|
function love.graphics.newImage(...)
|
||
|
|
local test = old_newImage(...)
|
||
|
|
test:setFilter("nearest","nearest",0,0)
|
||
|
|
return test
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
local debug_text = {}
|
||
|
|
local debug_timer = 5
|
||
|
|
function add_debug_mesage(text, color)
|
||
|
|
debug_text[text]={timer=debug_timer, color = color}
|
||
|
|
end
|
||
|
|
|
||
|
|
function debug_message_update(dt)
|
||
|
|
for k,v in pairs (game.debug_text) do
|
||
|
|
debug_text[k].timer=debug_text[k].timer - dt
|
||
|
|
if debug_text[k].timer < 0 then debug_text[k] = nil end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
function deepcopy(orig)
|
||
|
|
local orig_type = type(orig)
|
||
|
|
local copy
|
||
|
|
if orig_type == 'table' then
|
||
|
|
copy = {}
|
||
|
|
for orig_key, orig_value in next, orig, nil do
|
||
|
|
if orig_key~="gamedef" then
|
||
|
|
copy[deepcopy(orig_key)] = deepcopy(orig_value)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
setmetatable(copy, deepcopy(getmetatable(orig)))
|
||
|
|
else -- number, string, boolean, etc
|
||
|
|
copy = orig
|
||
|
|
end
|
||
|
|
return copy
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
__POSTPONED = {}
|
||
|
|
|
||
|
|
function update_timers(dt)
|
||
|
|
for k,v in pairs(__POSTPONED) do
|
||
|
|
v.ttl = v.ttl-dt
|
||
|
|
if v.ttl<0 then
|
||
|
|
v.func(v.args)
|
||
|
|
__POSTPONED[k] = nil
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function after(dt, func, ...)
|
||
|
|
__POSTPONED[#__POSTPONED+1] = {ttl = dt, func = func, args = ...}
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
-- UTF-8 Reference:
|
||
|
|
-- 0xxxxxxx - 1 byte UTF-8 codepoint (ASCII character)
|
||
|
|
-- 110yyyxx - First byte of a 2 byte UTF-8 codepoint
|
||
|
|
-- 1110yyyy - First byte of a 3 byte UTF-8 codepoint
|
||
|
|
-- 11110zzz - First byte of a 4 byte UTF-8 codepoint
|
||
|
|
-- 10xxxxxx - Inner byte of a multi-byte UTF-8 codepoint
|
||
|
|
|
||
|
|
function chsize(char)
|
||
|
|
if not char then
|
||
|
|
return 0
|
||
|
|
elseif char > 240 then
|
||
|
|
return 4
|
||
|
|
elseif char > 225 then
|
||
|
|
return 3
|
||
|
|
elseif char > 192 then
|
||
|
|
return 2
|
||
|
|
else
|
||
|
|
return 1
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- This function can return a substring of a UTF-8 string, properly handling
|
||
|
|
-- UTF-8 codepoints. Rather than taking a start index and optionally an end
|
||
|
|
-- index, it takes the string, the starting character, and the number of
|
||
|
|
-- characters to select from the string.
|
||
|
|
|
||
|
|
function utf8sub(str, startChar, numChars)
|
||
|
|
local startIndex = 1
|
||
|
|
while startChar > 1 do
|
||
|
|
local char = string.byte(str, startIndex)
|
||
|
|
startIndex = startIndex + chsize(char)
|
||
|
|
startChar = startChar - 1
|
||
|
|
end
|
||
|
|
|
||
|
|
local currentIndex = startIndex
|
||
|
|
|
||
|
|
while numChars > 0 and currentIndex <= #str do
|
||
|
|
local char = string.byte(str, currentIndex)
|
||
|
|
currentIndex = currentIndex + chsize(char)
|
||
|
|
numChars = numChars -1
|
||
|
|
end
|
||
|
|
return str:sub(startIndex, currentIndex - 1)
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
function clamp(v)
|
||
|
|
if v < 000 then return 000 end
|
||
|
|
if v > 255 then return 255 end
|
||
|
|
return math.floor(v + 0.5)
|
||
|
|
end
|
||
|
|
|
||
|
|
function rotate_hue(color, degrees)
|
||
|
|
local matrix = {[0]={1,0,0}, [1]={0,1,0}, [2]={0,0,1}}
|
||
|
|
local cosA = math.cos(math.rad(degrees))
|
||
|
|
local sinA = math.sin(math.rad(degrees))
|
||
|
|
local sqrt = math.sqrt
|
||
|
|
|
||
|
|
matrix[0][0] = cosA + (1.0 - cosA) / 3.0
|
||
|
|
matrix[0][1] = 1./3. * (1.0 - cosA) - sqrt(1./3.) * sinA
|
||
|
|
matrix[0][2] = 1./3. * (1.0 - cosA) + sqrt(1./3.) * sinA
|
||
|
|
matrix[1][0] = 1./3. * (1.0 - cosA) + sqrt(1./3.) * sinA
|
||
|
|
matrix[1][1] = cosA + 1./3.*(1.0 - cosA)
|
||
|
|
matrix[1][2] = 1./3. * (1.0 - cosA) - sqrt(1./3.) * sinA
|
||
|
|
matrix[2][0] = 1./3. * (1.0 - cosA) - sqrt(1./3.) * sinA
|
||
|
|
matrix[2][1] = 1./3. * (1.0 - cosA) + sqrt(1./3.) * sinA
|
||
|
|
matrix[2][2] = cosA + 1./3. * (1.0 - cosA)
|
||
|
|
|
||
|
|
local r,g,b = color[1],color[2],color[3]
|
||
|
|
|
||
|
|
local rx = r * matrix[0][0] + g * matrix[0][1] + b * matrix[0][2]
|
||
|
|
local gx = r * matrix[1][0] + g * matrix[1][1] + b * matrix[1][2]
|
||
|
|
local bx = r * matrix[2][0] + g * matrix[2][1] + b * matrix[2][2]
|
||
|
|
return clamp(rx), clamp(gx), clamp(bx)
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
function imageColorShift(img, degrees, sat)
|
||
|
|
local image = img--:getData()
|
||
|
|
print(image)
|
||
|
|
local r, g, b, a
|
||
|
|
local w, h = image:getDimensions()
|
||
|
|
for i=0, w-1, 1 do
|
||
|
|
for j=0, h-1, 1 do
|
||
|
|
r, g, b ,a = image:getPixel(i, j)
|
||
|
|
r, g, b = rotate_hue({r,g,b}, degrees)
|
||
|
|
r,g,b = clamp(r+sat), clamp(g+sat), clamp(b+sat)
|
||
|
|
image:setPixel(i, j, r, g, b, a)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return love.graphics.newImage(img)
|
||
|
|
end
|
||
|
|
|
||
|
|
local sel = love.graphics.newImage('gfx/sel.png')
|
||
|
|
|
||
|
|
love.graphics.pretty_print = function(text,x,y,s,c,sho,ad, sym)
|
||
|
|
if sym then
|
||
|
|
local W = menu.font:getWidth(text)
|
||
|
|
local W1 = menu.font:getWidth(sym[1])
|
||
|
|
local W2 = menu.font:getWidth(sym[2])
|
||
|
|
local X1 = x-20*game.scaley
|
||
|
|
local X2 = x-3*game.scaley
|
||
|
|
if not s then s = 1 end
|
||
|
|
love.graphics.setColor(0, 0, 0)
|
||
|
|
for i=-1,1 do
|
||
|
|
for j=-1,1 do
|
||
|
|
love.graphics.print(sym[1],math.sin(game.sin_timer)*10*game.scaley+ X1+i*s/2,y+j*s/2)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
for i=-1,1 do
|
||
|
|
for j=-1,1 do
|
||
|
|
love.graphics.print(sym[2],-math.sin(game.sin_timer)*10*game.scaley+W+X2+i*s/2,y+j*s/2)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if not c then
|
||
|
|
love.graphics.setColor(255, 255, 255)
|
||
|
|
else
|
||
|
|
love.graphics.setColor(c[1], c[2], c[3])
|
||
|
|
end
|
||
|
|
love.graphics.print(sym[1],math.sin(game.sin_timer)*10*game.scaley+ X1,y)
|
||
|
|
love.graphics.print(sym[2],-math.sin(game.sin_timer)*10*game.scaley+W+X2,y)
|
||
|
|
love.graphics.setColor(255, 255, 255)
|
||
|
|
end
|
||
|
|
|
||
|
|
if sho then
|
||
|
|
if ad then
|
||
|
|
love.graphics.setColor( 0, 255, 0)
|
||
|
|
else
|
||
|
|
love.graphics.setColor( 255, 0, 0)
|
||
|
|
end
|
||
|
|
local H = menu.font:getHeight(text)
|
||
|
|
local W = menu.font:getWidth(text)
|
||
|
|
love.graphics.draw(sel, x, y, 0, W/100, H/25)
|
||
|
|
end
|
||
|
|
|
||
|
|
if not s then s = 1 end
|
||
|
|
love.graphics.setColor(0, 0, 0)
|
||
|
|
for i=-1,1 do
|
||
|
|
for j=-1,1 do
|
||
|
|
love.graphics.print(text,x+i*s/2,y+j*s/2)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if not c then
|
||
|
|
love.graphics.setColor(255, 255, 255)
|
||
|
|
else
|
||
|
|
love.graphics.setColor(c[1], c[2], c[3])
|
||
|
|
end
|
||
|
|
love.graphics.print(text,x,y)
|
||
|
|
love.graphics.setColor(255, 255, 255)
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
local next=next
|
||
|
|
local type=type
|
||
|
|
local tostring=tostring
|
||
|
|
|
||
|
|
local format=string.format
|
||
|
|
|
||
|
|
local sort=table.sort
|
||
|
|
local concat=function(tbl,sep)
|
||
|
|
tbl2 = {}
|
||
|
|
for k,v in pairs(tbl) do
|
||
|
|
if k and v then
|
||
|
|
tbl2[k] = v
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return table.concat(tbl2,sep)
|
||
|
|
end
|
||
|
|
|
||
|
|
serialize = function(t, ind)
|
||
|
|
if not ind then ind = '' end
|
||
|
|
local TYPE=type(t)
|
||
|
|
if TYPE=="boolean" or TYPE=="number" then
|
||
|
|
return tostring(t)
|
||
|
|
elseif TYPE=="string" then
|
||
|
|
return format("%q",t)
|
||
|
|
elseif TYPE=="table" then
|
||
|
|
local ret={}
|
||
|
|
local r_v={}
|
||
|
|
local n=0
|
||
|
|
for i,v in next,t do
|
||
|
|
local sv=serialize(v,ind..'\t')
|
||
|
|
if sv~=nil then
|
||
|
|
ret[#ret+1]=ind.."["..serialize(i).."]="..sv
|
||
|
|
n=n+1
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return "{\n"..concat(ret,",\n").."\n}"
|
||
|
|
else
|
||
|
|
return --"&"..TYPE.."="..format("%q",tostring(t))
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
table_print = function(tt, indent, done)
|
||
|
|
done = done or {}
|
||
|
|
indent = indent or 0
|
||
|
|
if type(tt) == "table" then
|
||
|
|
local sb = {}
|
||
|
|
for key, value in pairs (tt) do
|
||
|
|
table.insert(sb, string.rep (" ", indent)) -- indent it
|
||
|
|
if type (value) == "table" and not done [value] then
|
||
|
|
done [value] = true
|
||
|
|
table.insert(sb, "{");
|
||
|
|
table.insert(sb, table_print (value, indent + 2, done))
|
||
|
|
table.insert(sb, string.rep (" ", indent)) -- indent it
|
||
|
|
table.insert(sb, "}\n");
|
||
|
|
elseif "number" == type(key) then
|
||
|
|
table.insert(sb, string.format("\"%s\",", tostring(value)))
|
||
|
|
else
|
||
|
|
table.insert(sb, string.format(
|
||
|
|
"%s = \"%s\",", tostring (key), tostring(value)))
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return table.concat(sb)
|
||
|
|
else
|
||
|
|
return tt .. "\n"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
to_string = function( tbl )
|
||
|
|
if "nil" == type( tbl ) then
|
||
|
|
return tostring(nil)
|
||
|
|
elseif "table" == type( tbl ) then
|
||
|
|
return table_print(tbl)
|
||
|
|
elseif "string" == type( tbl ) then
|
||
|
|
return tbl
|
||
|
|
else
|
||
|
|
return tostring(tbl)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function round(val, num)
|
||
|
|
if not num then num = 2 end
|
||
|
|
local n = 1
|
||
|
|
for i=1, n do n = n*10 end
|
||
|
|
if type(val)~="number" then return 0 end
|
||
|
|
return math.floor((val+0.5)*n)/n
|
||
|
|
end
|
||
|
|
|
||
|
|
function round2(val, num)
|
||
|
|
if not num then num = 2 end
|
||
|
|
local n = 1
|
||
|
|
for i=1, n do n = n*10 end
|
||
|
|
if type(val)~="number" then return 0 end
|
||
|
|
return math.floor((val)*n)/n
|
||
|
|
end
|