339 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			339 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- utils.lua by binbinhfr, v1.0.16
 | |
| 
 | |
| -- define debug_status to 1 or nil in the control.lua, before statement require("utils")
 | |
| -- define also debug_file and debug_mod_name
 | |
| 
 | |
| colors = {
 | |
| 	white = {r = 1, g = 1, b = 1},
 | |
| 	black = {r = 0, g = 0, b = 0},
 | |
| 	darkgrey = {r = 0.25, g = 0.25, b = 0.25},
 | |
| 	grey = {r = 0.5, g = 0.5, b = 0.5},
 | |
| 	lightgrey = {r = 0.75, g = 0.75, b = 0.75},
 | |
| 
 | |
| 	red = {r = 1, g = 0, b = 0},
 | |
| 	darkred = {r = 0.5, g = 0, b = 0},
 | |
| 	lightred = {r = 1, g = 0.5, b = 0.5},
 | |
| 	green = {r = 0, g = 1, b = 0},
 | |
| 	darkgreen = {r = 0, g = 0.5, b = 0},
 | |
| 	lightgreen = {r = 0.5, g = 1, b = 0.5},
 | |
| 	blue = {r = 0, g = 0, b = 1},
 | |
| 	darkblue = {r = 0, g = 0, b = 0.5},
 | |
| 	lightblue = {r = 0.5, g = 0.5, b = 1},
 | |
| 
 | |
| 	orange = {r = 1, g = 0.55, b = 0.1},
 | |
| 	yellow = {r = 1, g = 1, b = 0},
 | |
| 	pink = {r = 1, g = 0, b = 1},
 | |
| 	purple = {r = 0.6, g = 0.1, b = 0.6},
 | |
| 	brown = {r = 0.6, g = 0.4, b = 0.1},
 | |
| }
 | |
| 
 | |
| anticolors = {
 | |
| 	white = colors.black,
 | |
| 	black = colors.white,
 | |
| 	darkgrey = colors.white,
 | |
| 	grey = colors.black,
 | |
| 	lightgrey = colors.black,
 | |
| 
 | |
| 	red = colors.white,
 | |
| 	darkred = colors.white,
 | |
| 	lightred = colors.black,
 | |
| 	green = colors.black,
 | |
| 	darkgreen = colors.white,
 | |
| 	lightgreen = colors.black,
 | |
| 	blue = colors.white,
 | |
| 	darkblue = colors.white,
 | |
| 	lightblue = colors.black,
 | |
| 
 | |
| 	orange = colors.black,
 | |
| 	yellow = colors.black,
 | |
| 	pink = colors.white,
 | |
| 	purple = colors.white,
 | |
| 	brown = colors.white,
 | |
| }
 | |
| 
 | |
| lightcolors = {
 | |
| 	white = colors.lightgrey,
 | |
| 	grey = colors.darkgrey,
 | |
| 	lightgrey = colors.grey,
 | |
| 
 | |
| 	red = colors.lightred,
 | |
| 	green = colors.lightgreen,
 | |
| 	blue = colors.lightblue,
 | |
| 	yellow = colors.orange,
 | |
| 	pink = colors.purple,
 | |
| }
 | |
| 
 | |
| local author_name1 = "BinbinHfr"
 | |
| local author_name2 = "binbin"
 | |
| local author_name3 = "savisitor15"
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function read_version(v)
 | |
| 	local v1, v2, v3 = string.match(v, "(%d+).(%d+).(%d+)")
 | |
| 	debug_print( "version cut = ", v1,v2,v3)
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function compare_versions(v1,v2)
 | |
| 	local v1a, v1b, v1c = string.match(v1, "(%d+).(%d+).(%d+)")
 | |
| 	local v2a, v2b, v2c = string.match(v2, "(%d+).(%d+).(%d+)")
 | |
| 	
 | |
| 	v1a = tonumber(v1a)
 | |
| 	v1b = tonumber(v1b)
 | |
| 	v1c = tonumber(v1c)
 | |
| 	v2a = tonumber(v2a)
 | |
| 	v2b = tonumber(v2b)
 | |
| 	v2c = tonumber(v2c)
 | |
| 	
 | |
| 	if v1a > v2a then
 | |
| 		return 1
 | |
| 	elseif v1a < v2a then
 | |
| 		return -1
 | |
| 	elseif v1b > v2b then
 | |
| 		return 1
 | |
| 	elseif v1b < v2b then
 | |
| 		return -1
 | |
| 	elseif v1c > v2c then
 | |
| 		return 1
 | |
| 	elseif v1c < v2c then
 | |
| 		return -1
 | |
| 	else
 | |
| 		return 0
 | |
| 	end
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function older_version(v1,v2)
 | |
| 	local v1a, v1b, v1c = string.match(v1, "(%d+).(%d+).(%d+)")
 | |
| 	local v2a, v2b, v2c = string.match(v2, "(%d+).(%d+).(%d+)")
 | |
| 	local ret
 | |
| 	
 | |
| 	v1a = tonumber(v1a)
 | |
| 	v1b = tonumber(v1b)
 | |
| 	v1c = tonumber(v1c)
 | |
| 	v2a = tonumber(v2a)
 | |
| 	v2b = tonumber(v2b)
 | |
| 	v2c = tonumber(v2c)
 | |
| 	
 | |
| 	if v1a > v2a then
 | |
| 		ret = false
 | |
| 	elseif v1a < v2a then
 | |
| 		ret = true
 | |
| 	elseif v1b > v2b then
 | |
| 		ret = false
 | |
| 	elseif v1b < v2b then
 | |
| 		ret = true
 | |
| 	elseif v1c < v2c then
 | |
| 		ret = true
 | |
| 	else
 | |
| 		ret = false
 | |
| 	end
 | |
| 	
 | |
| 	debug_print( "older_version ", v1, "<", v2, "=", ret )
 | |
| 	
 | |
| 	return(ret)
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function debug_active(...)
 | |
| 	-- can be called everywhere, except in on_load where game is not existing
 | |
| 	local s = ""
 | |
| 	
 | |
| 	for i, v in ipairs({...}) do
 | |
| 		s = s .. tostring(v)
 | |
| 	end
 | |
| 
 | |
| 	if s == "RAZ" or debug_do_raz == true then
 | |
| 		game.remove_path(debug_file)
 | |
| 		debug_do_raz = false
 | |
| 	elseif s == "CLEAR" then
 | |
| 		for _, player in pairs(game.players) do
 | |
| 			if player.connected then player.clear_console() end
 | |
| 		end
 | |
| 	end
 | |
| 
 | |
| 	s = debug_mod_name .. "(" .. game.tick .. "): " .. s
 | |
| 	game.write_file( debug_file, s .. "\n", true )
 | |
| 	
 | |
| 	for _, player in pairs(game.players) do
 | |
| 		if player.connected then player.print(s) end
 | |
| 	end
 | |
| end
 | |
| 
 | |
| if debug_status == 1 then debug_print = debug_active else debug_print = function() end end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function message_all(s)
 | |
| 	for _, player in pairs(game.players) do
 | |
| 		if player.connected then
 | |
| 			player.print(s)
 | |
| 		end
 | |
| 	end
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function message_force(force, s)
 | |
| 	for _, player in pairs(force.players) do
 | |
| 		if player.connected then
 | |
| 			player.print(s)
 | |
| 		end
 | |
| 	end
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function square_area( origin, radius )
 | |
| 	return {
 | |
| 		{x=origin.x - radius, y=origin.y - radius},
 | |
| 		{x=origin.x + radius, y=origin.y + radius}
 | |
| 	}
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function distance( pos1, pos2 )
 | |
| 	local dx = pos2.x - pos1.x
 | |
| 	local dy = pos2.y - pos1.y
 | |
| 	return( math.sqrt(dx*dx+dy*dy) )
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function distance_square( pos1, pos2 )
 | |
| 	return( math.max(math.abs(pos2.x - pos1.x),math.abs(pos2.y - pos1.y)) )
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function pos_offset( pos, offset )
 | |
| 	return { x=pos.x + offset.x, y=pos.y + offset.y }
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function surface_area(surf)
 | |
| 	local x1, y1, x2, y2 = 0,0,0,0
 | |
| 	
 | |
| 	for chunk in surf.get_chunks() do
 | |
| 		if chunk.x < x1 then
 | |
| 			x1 = chunk.x
 | |
| 		elseif chunk.x > x2 then
 | |
| 			x2 = chunk.x
 | |
| 		end
 | |
| 		if chunk.y < y1 then
 | |
| 			y1 = chunk.y
 | |
| 		elseif chunk.y > y2 then
 | |
| 			y2 = chunk.y
 | |
| 		end
 | |
| 	end
 | |
| 	
 | |
| 	return( {{x1*32-8,y1*32-8},{x2*32+40,y2*32+40}} )
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function iif( cond, val1, val2 )
 | |
| 	if cond then
 | |
| 		return val1
 | |
| 	else
 | |
| 		return val2
 | |
| 	end
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function add_list(list, obj)
 | |
| 	-- to avoid duplicates...
 | |
| 	for i, obj2 in pairs(list) do
 | |
| 		if obj2 == obj then
 | |
| 			return(false)
 | |
| 		end
 | |
| 	end
 | |
| 	table.insert(list,obj)
 | |
| 	return(true)
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function del_list(list, obj)
 | |
| 	for i, obj2 in pairs(list) do
 | |
| 		if obj2 == obj then
 | |
| 			table.remove( list, i )
 | |
| 			return(true)
 | |
| 		end
 | |
| 	end
 | |
| 	return(false)
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function in_list(list, obj)
 | |
| 	for k, obj2 in pairs(list) do
 | |
| 		if obj2 == obj then
 | |
| 			return(k)
 | |
| 		end
 | |
| 	end
 | |
| 	return(nil)
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function size_list(list)
 | |
| 	local n = 0
 | |
| 	for i in pairs(list) do
 | |
| 		n = n + 1
 | |
| 	end
 | |
| 	return(n)
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function concat_lists(list1, list2)
 | |
| 	-- add list2 into list1 , do not avoid duplicates...
 | |
| 	for i, obj in pairs(list2) do
 | |
| 		table.insert(list1,obj)
 | |
| 	end
 | |
| end
 | |
| 
 | |
| ------------------------------------------------------------------------------------
 | |
| function is_dev(player)
 | |
| 	return( player.name == author_name1 or player.name == author_name2  or string.upper(player.name) == string.upper(author_name3))
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function dupli_proto( type, name1, name2 )
 | |
| 	if data.raw[type][name1] then 
 | |
| 		local proto = table.deepcopy(data.raw[type][name1])
 | |
| 		proto.name = name2
 | |
| 		if proto.minable and proto.minable.result then proto.minable.result = name2	end
 | |
| 		if proto.place_result then proto.place_result = name2 end
 | |
| 		if proto.take_result then proto.take_result = name2	end
 | |
| 		if proto.result then proto.result = name2 end
 | |
| 		return(proto)
 | |
| 	else
 | |
| 		error("prototype unknown " .. name1 )
 | |
| 		return(nil)
 | |
| 	end
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function debug_guis( guip, indent )
 | |
| 	if guip == nil then return end
 | |
| 	debug_print( indent .. string.rep("....",indent) .. " " .. guip.name )
 | |
| 	indent = indent+1
 | |
| 	for k, gui in pairs(guip.children_names) do
 | |
| 		debug_guis( guip[gui], indent )
 | |
| 	end
 | |
| end
 | |
| 
 | |
| --------------------------------------------------------------------------------------
 | |
| function extract_monolith(filename, x, y, w, h)
 | |
| 	return {
 | |
| 		type = "monolith",
 | |
| 
 | |
| 		top_monolith_border = 0,
 | |
| 		right_monolith_border = 0,
 | |
| 		bottom_monolith_border = 0,
 | |
| 		left_monolith_border = 0,
 | |
| 
 | |
| 		monolith_image = {
 | |
| 			filename = filename,
 | |
| 			priority = "extra-high-no-scale",
 | |
| 			width = w,
 | |
| 			height = h,
 | |
| 			x = x,
 | |
| 			y = y,
 | |
| 		},
 | |
| 	}
 | |
| end
 | |
| 
 |