This commit is contained in:
Deet Mit 2020-09-04 16:20:32 +02:00
parent 37f3d7bd02
commit 1f6b7789ef
120 changed files with 4298 additions and 1 deletions

@ -1 +0,0 @@
Subproject commit 700e2e90b5f3aef873721158c4dd09accf8341b7

@ -0,0 +1,405 @@
dofile(minetest.get_modpath("mesecons_autotools").."/book/mx.lua");
dofile(minetest.get_modpath("mesecons_autotools").."/book/m3.lua");
dofile(minetest.get_modpath("mesecons_autotools").."/book/formspec.lua");
dofile(minetest.get_modpath("mesecons_autotools").."/book/image.lua");
dofile(minetest.get_modpath("mesecons_autotools").."/book/misc.lua");
dofile(minetest.get_modpath("mesecons_autotools").."/book/stats.lua");
local esc = minetest.formspec_escape
local function show_dialog_new(user,direction)
local pos1 = mesecons_autotools.get_pos(user,1)
local pos2 = mesecons_autotools.get_pos(user,2)
local sel = {pos1=pos1,pos2=pos2}
if not mesecons_autotools.is_full_selection(user) then return end
local nodes = selection_to_m3(pos1,pos2,direction)
local view = m3_to_mx(nodes)
local db = {
title = "",
text = "",
nodes = nodes,
direction = direction,
view = view,
}
local formspec = fs_all(db)
minetest.show_formspec(user, "mesecons_autotools:circuit_new", formspec)
end
local function show_dialog_full(user,file)
local info = read_table_from_file(file)
local view = m3_to_mx(info.nodes)
local db = {
title = info.title,
text = info.text,
nodes = info.nodes,
direction = info.direction,
view = view,
}
local formspec = fs_all(db)
minetest.show_formspec(user, "mesecons_autotools:circuit_edit", formspec)
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "mesecons_autotools:circuit_new" then return end
if (fields.save) or fields.key_enter_field == "title" then
local user = player:get_player_name()
local file = generate_file_name(user)
local rad = player:get_look_horizontal()
local direction = radians_to_direction_looking_forward(rad)
local stack = player:get_wielded_item()
local inv = player:get_inventory()
local new_stack = nil
local info = {}
local data = {}
if( stack:get_name() == "mesecons_autotools:circuit_empty" ) then
new_stack = ItemStack("mesecons_autotools:circuit_full")
data.file = file
data.description = fields.title
new_stack:get_meta():from_table({ fields = data})
if inv:room_for_item("main", new_stack) then
inv:add_item("main", new_stack)
else
minetest.add_item(player:get_pos(), new_stack)
end
-- standart info
info.title = fields.title
info.text = fields.text
-- direction
info.direction = direction
--info.direction = direction
-- selection
local pos1 = mesecons_autotools.get_pos(user,1)
local pos2 = mesecons_autotools.get_pos(user,2)
local nodes = selection_to_m3(pos1,pos2,direction)
info.nodes = nodes
save_table_to_file(file,info)
end
end
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "mesecons_autotools:circuit_edit" then return end
if (fields.save) or fields.key_enter_field == "title" then
local user = player:get_player_name()
local rad = player:get_look_horizontal()
local direction = radians_to_direction_looking_forward(rad)
local stack = player:get_wielded_item()
local data = stack:get_meta():to_table().fields
--local inv = player:get_inventory()
local info = {}
local file = data.file
--[[
info = read_table_from_file(file)
info.title = fields.title
info.text = fields.text
save_table_to_file(file,info)
]]--
data.title = fields.title
data.text = fields.text
data.description = fields.title
stack:get_meta():from_table({ fields = data})
player:set_wielded_item(stack)
end
end)
function rotate_direction_right(direction)
local d = {x=0,y=0,z=0}
if direction.z == 1 then
d.x = 1
end
if direction.x == 1 then
d.z = -1
end
if direction.z == -1 then
d.x = -1
end
if direction.x == -1 then
d.z = 1
end
return d
end
function make_pos2(pos1,direction,sx,sy,sz)
local right = rotate_direction_right(direction)
local hv = vector.multiply(direction,sz-1)
local vv = vector.multiply(right,sx-1)
local uv = vector.multiply({x=0,y=1,z=0},sy-1)
local shift = vector.add(hv, vector.add(vv,uv))
local pos2 = vector.add(pos1, shift)
return pos2
end
function get_all_corners_flat(sel)
local pos = {}
pos[1] = sel.pos1
pos[2] = sel.pos2
local xmax = math.max(pos[1].x, pos[2].x)
local xmin = math.min(pos[1].x, pos[2].x)
local ymax = math.max(pos[1].y, pos[2].y)
local ymin = math.min(pos[1].y, pos[2].y)
local zmax = math.max(pos[1].z, pos[2].z)
local zmin = math.min(pos[1].z, pos[2].z)
local pos00 = vector.new(xmin,ymin,zmin)
local pos11 = vector.new(xmax,ymin,zmax)
local pos10 = vector.new(xmax,ymin,zmin)
local pos01 = vector.new(xmin,ymin,zmax)
return {pos00=pos00,pos01=pos01,pos10=pos10,pos11=pos11}
end
function get_corner00(sel,direction)
local crs = get_all_corners_flat(sel)
if direction.z == 1 then
return crs.pos00
end
if direction.x == 1 then
return crs.pos01
end
if direction.z == -1 then
return crs.pos11
end
if direction.x == -1 then
return crs.pos10
end
end
function add_vectors(a,b,c)
return vector.add(a,vector.add(b,c))
end
function direction_to_number(direction)
if direction.z == 1 then return 0 end
if direction.x == 1 then return 1 end
if direction.z == -1 then return 2 end
if direction.x == - 1 then return 3 end
end
function number_to_direction(nr)
if nr == 0 then return {x=0,y=0,z=1} end
if nr == 1 then return {x=1,y=0,z=0} end
if nr == 2 then return {x=0,y=0,z=-1} end
if nr == 3 then return {x=-1,y=0,z=0} end
end
function diff_directions(d1,d2)
local p1 = direction_to_number(d1)
local p2 = direction_to_number(d2)
return number_to_direction( (p2-p1+4)%4 )
end
function flip(v)
if v == nil then return nil end
return vector.multiply(v,-1)
end
function paste_circuit(sel,file,direction)
if sel.pos1 == nil then return end
if sel.pos2 == nil then return end
local info = read_table_from_file(file)
--local rotate_direction = diff_directions(direction)
--local nodes = rotate_m3(info.nodes,direction)
local nodes = info.nodes
local sx = nodes.sx
local sy = nodes.sy
local sz = nodes.sz
local right = rotate_direction_right(direction)
local start_pos = get_corner00(sel,direction)
for xi=1,sx do
for zi=1,sz do
for yi=1,sy do
local shift= add_vectors(
vector.multiply(right,xi-1),
vector.multiply(direction,zi-1),
vector.multiply({x=0,y=1,z=0},yi-1))
local pos = vector.add(start_pos, shift)
if is_in_selection(sel,pos) then
local node = m3_get(nodes,xi,yi,zi)
node = rotate_node(node,{x=0,y=0,z=1},direction)
--minetest.set_node(pos, node)
mesecons_autotools.set_node(pos,node,"paste_circuit")
end
end
end
end
end
local function make_selection(user,file,direction,pos)
local info = read_table_from_file(file)
--local rotate_direction = diff_directions(info.direction,direction)
local rotate_direction= info.direction
local nodes = info.nodes
local sx = nodes.sx
local sy = nodes.sy
local sz = nodes.sz
local pos2 = make_pos2(pos,direction,sx,sy,sz)
-- Update
mesecons_autotools.set_pos(user,1,pos)
mesecons_autotools.set_pos(user,2,pos2)
mesecons_autotools.render(user)
mesecons_autotools.zero_stack_counter(user)
mesecons_autotools.zero_stack_direction(user)
end
local function on_place_full_circuit(itemstack, player, pointed_thing)
local user = player:get_player_name()
local rad = player:get_look_horizontal()
local direction = radians_to_direction_looking_forward(rad)
local fields = itemstack:get_meta():to_table().fields
local file = fields.file
if not mesecons_autotools.is_full_selection(user) then return nil end
local pos1 = mesecons_autotools.get_pos(user,1)
local pos2 = mesecons_autotools.get_pos(user,2)
local sel = {pos1=pos1,pos2=pos2}
paste_circuit(sel,file,direction)
end
local function on_use_new_circuit(itemstack, player, pointed_thing)
local user = player:get_player_name()
local rad = player:get_look_horizontal()
local direction = radians_to_direction_looking_forward(rad)
if not mesecons_autotools.is_full_selection(user) then
-- show dialog with info or chat info
return
end
show_dialog_new(user,direction)
return nil
end
local function on_use_full_circuit(itemstack, player, pointed_thing)
local user = player:get_player_name()
local rad = player:get_look_horizontal()
local direction = radians_to_direction_looking_forward(rad)
local fields = itemstack:get_meta():to_table().fields
local file = fields.file
if( pointed_thing.type == "node" ) then
make_selection(user,file,direction,pointed_thing.above)
else
show_dialog_full(user,file,player)
end
return nil
end
local function none(itemstack, player, pointed_thing)
return nil
end
--minetest.register_craftitem("mesecons_autotools:circuit_empty", {
minetest.register_tool("mesecons_autotools:circuit_empty", {
description = "Circuit Empty",
inventory_image = "circuit_empty.png",
stack_max = 1,
on_use = on_use_new_circuit,
on_place = none,
on_secondary_use = none,
})
--minetest.register_craftitem("mesecons_autotools:circuit_full", {
minetest.register_tool("mesecons_autotools:circuit_full", {
description = "Circuit saved",
inventory_image = "circuit_full.png",
groups = {not_in_creative_inventory = 1},
stack_max = 1,
on_use = on_use_full_circuit,
on_place = on_place_full_circuit,
--on_secondary_use = on_place_full_circuit,
})

@ -0,0 +1,47 @@
mesecons_autotools.rand = PcgRandom(2);
function generate_file_name(user)
local days = minetest.get_day_count()
local sec = minetest.get_gametime()
local rand = math.abs(mesecons_autotools.rand:next())
local file = "circuit-"..user.."-"..sec.."-" .. rand
return file
end
local path = minetest.get_worldpath() .. "/circuits/"
function save_table_to_file(filename,tab)
minetest.mkdir(path)
local file, err = io.open(path .. filename, "wb")
if err ~= nil then
-- player_notify(name, "Could not save file to \"" .. filename .. "\"")
print ("mesecons_autotools: ERROR: file save error")
return
end
local result = minetest.serialize(tab)
file:write(result)
file:flush()
file:close()
end
function read_table_from_file(filename)
minetest.mkdir(path)
local file, err = io.open(path .. filename, "rb")
if err ~= nil then
-- notify
print ("mesecons_autotools: ERROR: file read error")
return nil
end
local value = file:read("*a")
file:close()
local tab = minetest.deserialize(value)
return tab
end

@ -0,0 +1,88 @@
local esc = minetest.formspec_escape
function fs_all(db)
local info = fs_info(db.title,db.text,db)
local stats = fs_stats(db.nodes, db.direction)
local circuit = fs_circuit(db.view)
local spec = info .. stats .. circuit
return spec
end
function fs_info(title,text)
local formspec =
"formspec_version[3]"..
"size[32,25]"..
"field[0.5,1;8,1;title;".."Name"..";"..esc(title).."]"..
"label[15,0.7;Circuit Preview]"..
"textarea[0.5,3;8,15;text;" .. "Description:" .. ";" ..
esc(text) .. "]" ..
"button_exit[2.5,18;3,1;save;" .. "Save" .. "]"
return formspec
end
function fs_circuit(mx_view)
local W = 20
local H = 20
local startx = 10
local starty = 2
local imagew = W/(mx_view.w)
local imageh = H/(mx_view.h)
if imageh > 1 then imageh = 1 end
if imagew > 1 then imagew = 1 end
local minsize = math.min(imageh,imagew)
imageh = minsize
imagew = minsize
local epsilon = 0.07
local spec = ""
for ix=1,mx_view.w do
for iy=1,mx_view.h do
local n = mx_get(mx_view,ix,iy)
if n == nil then n = {name="air",param2=0} end
local img = node_to_image( n )
spec = spec .. "image["..
startx+ix*imagew .. "," ..
starty+(mx_view.h-iy+1)*imageh .. ";" ..
imagew +epsilon .. "," ..
imageh +epsilon .. ";" ..
img .. "]"
end
end
return spec
end
function fs_stats(nodes,direction)
local block, gate, wire = get_stats(nodes)
local sx = nodes.sx
local sy = nodes.sy
local sz = nodes.sz
local stats = "size : " .. sx .. "x"..sy .. "x"..sz .. "(=".. sx*sy*sz .. ")\n" ..
"wires : " .. wire .. "\n" ..
"gates : " .. gate .. "\n" ..
"others : ".. block - wire - gate .. "\n" ..
"blocks: " .. block
local spec = "textarea[0.5,19;8,5;;;" .. esc(stats) .. "]"
return spec
end

@ -0,0 +1,125 @@
function node_to_image(node)
if node == nil then
return "empty.png"
end
local name = node.name
local param2 = node.param2 or 0
if( name == "air" ) then
return "empty.png"
end
if (name == "mesecons_insulated:insulated_off") or
(name == "mesecons_insulated:insulated_on" ) then
if( param2 % 2 == 0 ) then
return "wireh.png"
else
return "wirev.png"
end
end
if (name == "mesecons_extrawires:crossover_off") or
(name == "mesecons_extrawires:crossover_on") or
(name == "mesecons_extrawires:crossover_01") or
(name == "mesecons_extrawires:crossover_10" ) then
return "corssover.png"
end
if (name == "mesecons_extrawires:corner_off" ) or
(name == "mesecons_extrawires:corner_on" ) then
return "corner"..param2 .. ".png"
end
if (name == "mesecons_extrawires:tjunction_off" ) or
(name == "mesecons_extrawires:tjunction_on" ) then
return "tjunction"..param2 .. ".png"
end
if ( name == "mesecons_morewires:xjunction_off" ) or
( name == "mesecons_morewires:xjunction_on" ) then
return "xjunction.png"
end
if( name == "mesecons_regs:flipflop_off" ) or ( name == "mesecons_regs:flipflop_on") then
return "ff"..param2..".png"
end
if( name == "mesecons_regs:latch_off" ) or ( name == "mesecons_regs:latch_on") then
return "latch"..param2..".png"
end
if( name == "mesecons_gates:and_off" ) or ( name =="mesecons_gates:and_on" )then
return "and".. param2 .. ".png"
end
if( name == "mesecons_gates:nand_off" ) or ( name =="mesecons_gates:nand_on" )then
return "nand".. param2 .. ".png"
end
if( name == "mesecons_gates:nor_off" ) or ( name =="mesecons_gates:nor_on" )then
return "nor".. param2 .. ".png"
end
if( name == "mesecons_gates:or_off" ) or ( name =="mesecons_gates:or_on" )then
return "or".. param2 .. ".png"
end
if( name == "mesecons_gates:xor_off" ) or ( name =="mesecons_gates:xor_on" )then
return "xor".. param2 .. ".png"
end
if( name == "mesecons_gates:diode_off" ) or ( name =="mesecons_gates:diode_on" )then
return "diode".. param2 .. ".png"
end
if( name == "mesecons_gates:not_off" ) or ( name =="mesecons_gates:not_on" )then
return "not".. param2 .. ".png"
end
if( name == "mesecons_switch:mesecon_switch_off" ) or ( name =="mesecons_switch:mesecon_switch_on" )then
return "mesecons_switch_off.png"
end
if ( name == "mesecons_lightstone:lightstone_white_off" ) or ( name == "mesecons_lightstone:lightstone_white_on" ) then
return "jeija_lightstone_white_on.png"
end
if (name == "mesecons_walllever:wall_lever_off" ) or (name == "mesecons_walllever:wall_lever_on" ) then
return "jeija_wall_lever_inv.png"
end
if (name == "default:mese" ) or (name == "mesecons_extrawires:mese_powered" )then
return "default_mese_block.png"
end
if (name == "mesecons_powerplant:power_plant") then
return "jeija_power_plant.png"
end
if (name == "mesecons_gates3:and3_off") or (name == "mesecons_gates3:and3_on" ) then
return "jeija_gate3_and3r"..param2..".png"
end
if (name == "mesecons_gates3:nand3_off") or (name == "mesecons_gates3:nand3_on" ) then
return "jeija_gate3_nand3r"..param2..".png"
end
if (name == "mesecons_gates3:or3_off") or (name == "mesecons_gates3:or3_on" ) then
return "jeija_gate3_or3r"..param2..".png"
end
if (name == "mesecons_gates3:nor3_off") or (name == "mesecons_gates3:nor3_on" ) then
return "jeija_gate3_nor3r"..param2..".png"
end
return "unknown.png"
end

@ -0,0 +1,220 @@
function render_circuit(circ,start_x,start_y)
circ.title = circ.title or ""
local spec = "button["..start_x..","..start_y..";10,1;".. "title_" .. circ.id .. ";"..circ.title.."]"
return spec,1
end
function f_fold(id,x,y,folded)
local fold_sign
if folded == true then
fold_sign = "+"
else
fold_sign = "-"
end
local spec = "button["..x..","..y..";1,1;".. "fold_" .. id ..";".. fold_sign.."]"
return spec, 1, 0
end
function render_lib(lib,start_x,start_y)
local xshift = 1
local yshift = 1
local total_yshift = 0
local total_xshift = 0
local id = lib.id
lib.title = lib.title or ""
lib.folded = lib.folded or false
local spec = ""
-- fold button
local ss,shx,shy = f_fold(id,start_x+total_xshift, start_y+total_yshift, lib.folded)
total_xshift = total_xshift+shx
total_yshift = total_yshift+shy
spec = spec .. ss
spec = spec ..
"button[".. start_x + total_xshift ..",".. start_y + total_yshift..
";10,1;".. "title_"..lib.id .. ";"..lib.title.."]"
total_xshift = start_x + 1
total_yshift = total_yshift+1
if lib.folded == false then
for _,v in ipairs(lib.list) do
if v.type == "library" then
local sp, ys = render_lib(v, start_x+total_xshift, start_y+total_yshift)
spec = spec .. sp
total_yshift = total_yshift + ys
elseif v.type == "circuit" then
local sp, ys = render_circuit(v,start_x+total_xshift, start_y+total_yshift)
spec = spec .. sp
total_yshift = total_yshift + ys
end
end
end
return spec, total_yshift
end
function traverse_list(list,action)
if list == nil then return end
for _,v in ipairs(list) do
print("traverser.id =" .. v.id)
if v.type == "circuit" then
action(v)
elseif v.type == "library" then
action(v)
traverse_list(v.list,action)
end
end
end
function foreach_id(list,action)
if list == nil then return end
traverse_list(list, function(elem)
action(elem.id)
end)
end
function get_elem_by_id(list,id)
local found
traverse_list(list,function(e)
if e.id == id then
found = e
end
end)
return found
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "mesecons_autotools:library_view" then return end
--print ("RECEIVE:=player="..dump(player) .. ", formname="..formname .. ".fiels="..dump(fields))
local user = player:get_player_name()
local stack = player:get_wielded_item()
local data = stack:get_meta():to_table().fields
local lib = data.lib
print("lib="..dump(lib))
if fields.quit then return end
--if lib == nil then return end
-- print("DB2: " .. dump(data))
-- print("FIELDS:"..dump(fields))
lib = lib or {}
-- print ("lib="..dump(lib))
traverse_list(lib.list,function(elem)
print("#")
if fields["fold_".. elem.id] == true then
elem.folded = not elem.folded
end
end)
-- print("libafger="..dump(lib))
--[[
if (fields.save) or fields.key_enter_field == "title" then
]]--
data.lib = lib
stack:get_meta():from_table({ fields = data})
player:set_wielded_item(stack)
local formspec = render_formspec(lib)
minetest.show_formspec(user, "mesecons_autotools:library_view", formspec)
end)
function render_formspec(lib)
local formspec = "formspec_version[3]"..
"size[32,25]"
formspec = formspec .. render_lib(lib,1,1)
return formspec
end
lib = {
id = "l1",
title = "library bla bla ",
type = "library",
list = {
{id = "c1", type="circuit", title="somethign something"},
{id = "c2", type="circuit", title="somethign something2"},
{id = "l2", type="library", title="wooihoihoh/", folded = false,
list = {
{id = "c11", type="circuit", title="somethign something"},
{id = "c21", type="circuit", title="somethign something2"},
}
},
{id = "c111", type="circuit", title="circuit sak/32/d0"},
}
}
function on_place_library(itemstack, player, pointed_thing)
local user = player:get_player_name()
local stack = player:get_wielded_item()
local data = stack:get_meta():to_table().fields
print("DU:"..dump(itemstack:get_meta():to_table()))
print("item stackc:" .. dump(itemstack))
if data.count == nil then data.count = 0 end
data.count = data.count + 1
stack:get_meta():from_table({ fields = data})
player:set_wielded_item(stack)
local formspec = render_formspec(lib)
-- print("formtspec="..formspec)
minetest.show_formspec(user, "mesecons_autotools:library_view", formspec)
end
minetest.register_tool("mesecons_autotools:library", {
description = "Library of Circuits",
inventory_image = "library.png",
stack_max = 1,
on_place = on_place_library,
--[[
on_use = on_use_new_circuit,
on_secondary_use = none,
]]--
})

@ -0,0 +1,271 @@
function m3_get(m,x,y,z)
if m == nil then return nil end
if m[x] == nil then return nil end
if m[x][y] == nil then return nil end
if m[x][y][z] == nil then return nil end
return m[x][y][z]
end
function m3_set(m,x,y,z,value)
if m == nil then m = {} end
if m[x] == nil then m[x] = {} end
if m[x][y] == nil then m[x][y] = {} end
if m[x][y][z] == nil then m[x][y][z] = {} end
m[x][y][z] = value
end
--[[
function m3_set_pos(m,pos1,pos2)
m.pos1 = pos1
m.pos2 = pos2
end
]]--
function m3_flip_xy(m)
local new_m = {}
for ix=1,m.sx do
for iz=1,m.sz do
for iy=1,m.sy do
m3_set(new_m,iz,iy,ix, m3_get(m,ix,iy,iz))
end
end
end
--[[
-- Rotate node
for ix=1,m.sx do
for iz=1,m.sz do
for iy=1,m.sy do
local node = m3_get(m,ix,iy,iz)
local rotated_node =
rotate_node_to_direction(node,{x=1,y=0,z=0})
m3_set(m,ix,iy,iz,rotated_node)
end
end
end
]]--
new_m.sx = m.sz
new_m.sz = m.sx
new_m.sy = m.sy
return new_m
end
function m3_flip_x(m)
local new_m = {}
for ix=1,m.sx do
for iz=1,m.sz do
for iy=1,m.sy do
m3_set(new_m,ix,iy,m.sz-iz+1, m3_get(m,ix,iy,iz))
end
end
end
--[[
for ix=1,m.sx do
for iz=1,m.sz do
for iy=1,m.sy do
local node = m3_get(m,ix,iy,iz)
local rotated_node =
rotate_node_to_direction(node,{x=0,y=0,z=-1})
m3_set(m,ix,iy,iz,rotated_node)
end
end
end
]]--
new_m.sx = m.sx
new_m.sz = m.sz
new_m.sy = m.sy
return new_m
end
function m3_rotate90(m)
return m3_flip_x( m3_flip_xy (m))
end
function m3_rotate180(m)
return m3_rotate90(m3_rotate90(m))
end
function m3_rotate270(m)
return m3_rotate90(m3_rotate90(m3_rotate90(m)))
end
function rotate_m3(m,direction)
if direction.x == 1 then
return m3_rotate270(m)
end
if direction.x == -1 then
return m3_rotate90(m)
end
if direction.z == 1 then
return m
end
if direction.z == -1 then
return m3_rotate180(m)
end
return m
end
function m3_move_to_000(m)
local new_m = {}
local pos1 = m.pos1
local pos2 = m.pos2
local xmin = math.min(pos1.x,pos2.x)
local ymin = math.min(pos1.y,pos2.y)
local zmin = math.min(pos1.z,pos2.z)
local xmax = math.max(pos1.x,pos2.x)
local ymax = math.max(pos1.y,pos2.y)
local zmax = math.max(pos1.z,pos2.z)
local sx = xmax - xmin + 1
local sy = ymax - ymin + 1
local sz = zmax - zmin + 1
for x=1,sx,1 do
for y=1,sy,1 do
for z=1,sz,1 do
m3_set(new_m,x,y,z,
m3_get(m, x-1 + xmin, y-1 + ymin, z-1+zmin))
end
end
end
new_m.sx = sx
new_m.sy = sy
new_m.sz = sz
return new_m
end
function selection_to_m3(pos1,pos2,direction)
local m = {}
iterate_selection(pos1,pos2,function(pos)
local node = minetest.get_node(pos)
m3_set(m,pos.x,pos.y,pos.z,node)
end)
m.pos1 = pos1
m.pos2 = pos2
m = m3_move_to_000(m)
m = rotate_m3(m,direction)
for ix=1,m.sx do
for iz=1,m.sz do
for iy=m.sy,1,-1 do
local node = m3_get(m,ix,iy,iz)
local rotated_node = rotate_node_to_direction(node,direction)
m3_set(m,ix,iy,iz,rotated_node)
end
end
end
return m
end
function m3_to_mx(m)
local mx={}
for ix=1,m.sx do
for iz=1,m.sz do
for iy=m.sy,1,-1 do
local pos = { x = ix, y=iy, z = iz }
local node = m3_get(m,ix,iy,iz)
if node.name ~= "air" then
mx_set(mx,ix,iz,node)
break
end
end
end
end
mx.w = m.sx
mx.h = m.sz
return mx
end
local function lmin(a,b)
if a == nil then
return b
else
if b == nil then
return a
else
return math.min(a,b)
end
end
end
local function lmax(a,b)
if a == nil then
return b
else
if b == nil then
return a
else
return math.max(a,b)
end
end
end
function list_to_m3(list)
local m = {}
local xmin,xmax,ymin,ymax,zmin,zmax
for _,v in pairs(list) do
local pos = v.pos
local node = v.node
m3_set(m,pos.x,pos.y,pos.z, node)
xmin = lmin(xmin, pos.x)
ymin = lmin(ymin, pos.y)
zmin = lmin(zmin, pos.z)
xmax = lmax(xmax, pos.x)
ymax = lmax(ymax, pos.y)
zmax = lmax(zmax, pos.z)
end
m.pos1 = {x=xmin,y=ymin,z=zmin}
m.pos2 = {x=xmax,y=ymax,z=zmax}
return m
end
function iterate_m3(m,action)
for x=1,m.sx do
for y=1,m.sy do
for z=1,m.sz do
action(m3_get(m,x,y,z))
end
end
end
end

@ -0,0 +1,48 @@
function rotate_node_to_direction(node,direction)
local add = 0
if direction.x == 1 then add = 3 end
if direction.x == -1 then add = 1 end
if direction.z == 1 then add = 0 end
if direction.z == -1 then add = 2 end
local param2 = node.param2
param2 = (param2+add)% 4
return { name = node.name , param2 = param2 }
end
local function direction_to_number(direction)
if( direction.z == 1 ) then
return 1
elseif( direction.x == 1 ) then
return 2
elseif(direction.z == -1 )then
return 3
else
return 4
end
end
function rotate_node(node, saved_direction,direction)
local values =
{
{0,1,2,3},
{3,0,1,2},
{2,3,0,1},
{1,2,3,0}
}
local rotate =
values[direction_to_number(saved_direction)][direction_to_number(direction)]
local new_node = {}
new_node.name = node.name
new_node.param2 = (node.param2+rotate)%4
return new_node
end

@ -0,0 +1,109 @@
function mx_get(m,x,y)
if m == nil then return nil end
if m[x] == nil then return nil end
if m[x][y] == nil then return nil end
return m[x][y]
end
function mx_set(m,x,y,value)
if m == nil then m = {} end
if m[x] == nil then m[x] = {} end
if m[x][y] == nil then m[x][y] = {} end
m[x][y] = value
end
function mx_flip_xy(m)
local new_m = {}
for i=1,m.w do
for k=1,m.h do
mx_set(new_m,k,i, mx_get(m,i,k))
end
end
new_m.h = m.w
new_m.w = m.h
return new_m
end
function mx_flip_y(m)
local new_m = {}
for i=1,m.w do
for k=1,m.h do
mx_set(new_m,m.w+1-i,k, mx_get(m,i,k))
end
end
new_m.h = m.h
new_m.w = m.w
return new_m
end
function mx_flip_x(m)
local new_m = {}
for i=1,m.w do
for k=1,m.h do
mx_set(new_m,i,m.h+1-k, mx_get(m,i,k))
end
end
new_m.h = m.h
new_m.w = m.w
return new_m
end
function mx_rotate90(m)
return mx_flip_x( mx_flip_xy (m))
end
function mx_rotate180(m)
return mx_rotate90(mx_rotate90(m))
end
function mx_rotate270(m)
return mx_rotate90(mx_rotate90(mx_rotate90(m)))
end
function rotate_mx(mx,direction)
if direction.x == 1 then
return mx_rotate270(mx)
end
if direction.x == -1 then
return mx_rotate90(mx)
end
if direction.z == 1 then
return mx
end
if direction.z == -1 then
return mx_rotate180(mx)
end
return mx
end
function move_mx_to_00(mx)
local new_mx = {}
local xmax = mx.xmax
local xmin = mx.xmin
local ymax = mx.ymax
local ymin = mx.ymin
local sx = xmax - xmin + 1
local sy = ymax - ymin + 1
for x=1,sx,1 do
for y=1,sy,1 do
mx_set(new_mx,x,y, mx_get(mx, x-1 + xmin, y-1 + ymin))
end
end
new_mx.w = sx
new_mx.h = sy
return new_mx
end

@ -0,0 +1,71 @@
function is_gate(node)
local gates = {
"mesecons_gates:and",
"mesecons_gates:or",
"mesecons_gates:xor",
"mesecons_gates:nand",
"mesecons_gates:nor",
"mesecons_gates:not",
"mesecons_gates:diode",
"mesecons_gates3:and3",
"mesecons_gates3:or3",
"mesecons_gates3:nor3",
"mesecons_gates3:nand3",
"mesecons_regs:flipflop",
"mesecons_regs:latch"
}
local gates_with_states = {}
for _,v in ipairs(gates) do
table.insert(gates_with_states,v.."_on")
table.insert(gates_with_states,v.."_off")
end
for _,v in ipairs(gates_with_states) do
if node.name == v then
return true
end
end
return false
end
function is_wire_node(node)
local list = {
"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_on",
"mesecons_extrawires:corner_off", "mesecons_extrawires:corner_on",
"mesecons_extrawires:tjunction_off", "mesecons_extrawires:tjunction_on",
"mesecons_extrawires:crossover_off", "mesecons_extrawires:crossover_on",
"mesecons_extrawires:crossover_10", "mesecons_extrawires:crossover_01",
"mesecons_morewires:xjunction_off", "mesecons_morewires:xjunction_on",
}
local pos_name = node.name
for i,name in ipairs(list) do
if name == pos_name then
return true
end
end
return false
end
function get_stats(m)
local blocks,gates,wires = 0,0,0
iterate_m3(m, function(node)
if is_wire_node(node) then
wires = wires + 1
end
if is_gate(node) then
gates = gates+1
end
if node.name ~= "air" then
blocks = blocks + 1
end
end)
return blocks,gates,wires
end

@ -0,0 +1,16 @@
-- Debug
function dump(o)
if type(o) == 'table' then
local s = '{ '
for k,v in pairs(o) do
if type(k) ~= 'number' then k = '"'..k..'"' end
s = s .. '['..k..'] = ' .. dump(v) .. ','
end
return s .. '} '
else
return tostring(o)
end
end

@ -0,0 +1,353 @@
dofile(minetest.get_modpath("mesecons_autotools").."/debug.lua");
mesecons_autotools = {}
mesecons_autotools.users = {}
mesecons_autotools.actions = {}
-- Basic functions
--[[
mesecons_autotools =
{
user_name = {
pos[1..2] = { x = number, y = number, z = number}
stack_direction = {x,y,z}
stack_counter = number
entities = <list of minetest.add_entity()>
options = {
option1 = value1
option2 = value2
}
}
user_name = ...
]]--
mesecons_autotools.set_pos = function(user,nr,pos)
if mesecons_autotools.users[user] == nil then
mesecons_autotools.users[user] = {}
end
if mesecons_autotools.users[user].pos == nil then
mesecons_autotools.users[user].pos = {}
end
if pos == nil then
mesecons_autotools.users[user].pos[nr] = nil
else
local p = vector.new(pos)
mesecons_autotools.users[user].pos[nr] = p
end
end
mesecons_autotools.get_pos = function(user,nr)
if mesecons_autotools.users[user] == nil then
return nil
end
if mesecons_autotools.users[user].pos == nil then
return nil
end
if mesecons_autotools.users[user].pos[nr] == nil then
return nil
else
return vector.new(mesecons_autotools.users[user].pos[nr])
end
end
mesecons_autotools.get_stack_counter = function(user)
if mesecons_autotools.users[user] == nil then
mesecons_autotools.users[user] = {}
end
if mesecons_autotools.users[user].stack_counter == nil then
mesecons_autotools.users[user].stack_counter = 0
end
return mesecons_autotools.users[user].stack_counter
end
mesecons_autotools.inc_stack_counter = function(user)
-- get value and create structure if needed
local count = mesecons_autotools.get_stack_counter(user)
mesecons_autotools.users[user].stack_counter = count + 1
end
mesecons_autotools.dec_stack_counter = function(user)
-- get value and create structure if needed
local count = mesecons_autotools.get_stack_counter(user)
if count == 0 then return end
mesecons_autotools.users[user].stack_counter = count - 1
end
mesecons_autotools.zero_stack_counter = function(user)
-- get value and create structure if needed
local count = mesecons_autotools.get_stack_counter(user)
mesecons_autotools.users[user].stack_counter = 0
end
mesecons_autotools.zero_stack_direction = function(user)
if mesecons_autotools.users[user] == nil then
mesecons_autotools.users[user] = {}
end
mesecons_autotools.users[user].stack_direction = { x = 0, y = 0, z =0 }
end
mesecons_autotools.set_stack_direction = function(user,direction)
-- get rid of nils
mesecons_autotools.zero_stack_direction(user)
mesecons_autotools.users[user].stack_direction = direction
end
mesecons_autotools.get_stack_direction = function(user)
if mesecons_autotools.users[user] == nil then
mesecons_autotools.users[user] = {}
end
if mesecons_autotools.users[user].stack_direction == nil then
mesecons_autotools.users[user].stack_direction = { x = 0, y = 0, z =0 }
end
return mesecons_autotools.users[user].stack_direction
end
mesecons_autotools.set_option = function(user,field,value)
if mesecons_autotools.users[user] == nil then
mesecons_autotools.users[user] = {}
end
if mesecons_autotools.users[user].options == nil then
mesecons_autotools.users[user].options = {}
end
mesecons_autotools.users[user].options[field] = value
end
mesecons_autotools.get_option = function(user,field)
if mesecons_autotools.users[user] == nil then
return nil
end
if mesecons_autotools.users[user].options == nil then
return nil
end
return mesecons_autotools.users[user].options[field]
end
mesecons_autotools.is_full_selection = function(user)
if mesecons_autotools.get_pos(user,1) == nil then return false end
if mesecons_autotools.get_pos(user,2) == nil then return false end
return true
end
-- Actions/Callbacks ('user' clicked 'button' on 'pos' using 'tool')
-- button = "left" | "right"
-- pos = { x = number, y = number, z = number }
-- tool = "black" | "red" | ...
-- type = "air" | "block"
mesecons_autotools.execute_action = function(tool,button,type,user,pos,rad,under)
-- if user == nil then return end
-- if pos == nil then return end
if tool == nil then return end
if button == nil then return end
if type == nil then return end
if rad == nil then return end
-- under == nil can be nil
if mesecons_autotools.actions[tool] == nil then return end
if mesecons_autotools.actions[tool][button] == nil then return end
if mesecons_autotools.actions[tool][button][type] == nil then return end
mesecons_autotools.actions[tool][button][type](user,pos,rad,under)
end
mesecons_autotools.register_action = function(tool,button,type,action)
if mesecons_autotools.actions[tool] == nil then
mesecons_autotools.actions[tool] = {}
end
if mesecons_autotools.actions[tool][button] == nil then
mesecons_autotools.actions[tool][button] = {}
end
if mesecons_autotools.actions[tool][button][type] == nil then
mesecons_autotools.actions[tool][button][type] = {}
end
mesecons_autotools.actions[tool][button][type] = action
end
function is_in_list(list,value)
for _,v in ipairs(list) do
if v == value then return true end
end
return false
end
function ref_place(pos,node)
if minetest.get_item_group(node.name, "mesecon_needs_receiver") == 1 then
mesecon.receiver_place(pos)
end
end
function ref_remove(pos,node)
if minetest.get_item_group(node.name, "mesecon_needs_receiver") == 1 then
mesecon.receiver_remove(pos)
end
end
mesecons_autotools.set_node = function(pos,node,why)
--[[
if node.name == "air" then
local n = minetest.get_node(pos)
mesecon.on_dignode(pos,n)
ref_remove(pos,n)
minetest.set_node(pos,node)
-- ref_place ???
else
local n = minetest.get_node(pos)
mesecon.on_dignode(pos,n)
ref_remove(pos,n)
minetest.set_node(pos,node)
mesecon.on_placenode(pos,node)
ref_place(pos,node)
end
if true then return end
local n = minetest.get_node(pos)
mesecon.on_dignode(pos,n)
ref_remove(pos,n)
minetest.set_node(pos,node)
mesecon.on_placenode(pos,node)
ref_place(pos,node)
if true then return end
]]--
if why == nil then
minetest.set_node(pos,node)
else
if is_in_list({"start_node","middle_node"},why) then
minetest.set_node(pos,node)
mesecon.on_placenode(pos,node)
ref_place(pos,node)
end
if is_in_list({"delete"},why) then
local n = minetest.get_node(pos)
mesecon.on_dignode(pos,n)
ref_remove(pos,n)
minetest.set_node(pos,node)
mesecon.on_placenode(pos,node)
ref_place(pos,node)
end
if is_in_list({"delete_crossover","delete_end"},why) then --
local n = minetest.get_node(pos)
mesecon.on_dignode(pos,n)
ref_remove(pos,n)
minetest.set_node(pos,node)
mesecon.on_placenode(pos,node)
ref_place(pos,node)
end
if is_in_list({"paste_circuit"},why) then
minetest.set_node(pos,node)
end
if is_in_list({"add_wire"},why) then
minetest.set_node(pos,node)
end
if is_in_list({"red"},why) then
local n = minetest.get_node(pos)
mesecon.on_dignode(pos,n)
ref_remove(pos,n)
minetest.set_node(pos,node)
mesecon.on_placenode(pos,node)
ref_place(pos,node)
end
if is_in_list({"put_tail_wires"},why) then
minetest.set_node(pos,node)
end
if is_in_list({"copy"},why) then
minetest.set_node(pos,node)
end
if is_in_list({"paste_from_buffor"},why) then
minetest.set_node(pos,node)
end
--[[
if is_in_list({"delete_crossover"},why) then
minetest.set_node(pos,node)
mesecon.on_placenode(pos,node)
ref_remove(pos,node)
end
if is_in_list({"delete_end"},why) then
minetest.set_node(pos,{name="air"})
mesecon.on_dignode(pos,node)
ref_remove(pos,node)
--mesecon.on_dignode(pos,{name="air"})
--mesecon.receiver_remove(pos,node)
--minetest.set_node(pos,node)
--mesecon.on_placenode(pos,node)
end
]]--
end
end
-- Register Tools
dofile(minetest.get_modpath("mesecons_autotools").."/tools.lua");
-- Register Rendering
dofile(minetest.get_modpath("mesecons_autotools").."/render.lua");
-- Regiser Circuit
dofile(minetest.get_modpath("mesecons_autotools").."/book/circuit.lua");
--dofile(minetest.get_modpath("mesecons_autotools").."/book/library.lua");
dofile(minetest.get_modpath("mesecons_autotools").."/book/file.lua");
-- Register chatcommands
dofile(minetest.get_modpath("mesecons_autotools").."/commands/all_commands.lua");

@ -0,0 +1,156 @@
-- Remove entities
local function clear_selection(user)
if mesecons_autotools.users[user] == nil then
mesecons_autotools.users[user] = {}
end
if mesecons_autotools.users[user].entities == nil then
mesecons_autotools.users[user].entities = {}
end
for _,v in pairs(mesecons_autotools.users[user].entities) do
v:remove()
end
mesecons_autotools.users[user].entities = {}
end
-- Register entities
minetest.register_entity(":mesecons_autotools:pos1", {
initial_properties = {
visual = "cube",
visual_size = {x=1.11, y=1.11, },
textures = {"pos1.png", "pos1.png",
"pos1.png", "pos1.png",
"pos1.png", "pos1.png"},
collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55},
physical = false,
static_save = false,
},
on_activate = function(self, staticdata, dtime_s)
end,
on_punch = function(self,hitter)
end,
on_blast = function(self, damage)
return false, false, {} -- don't damage or knockback
end,
})
minetest.register_entity(":mesecons_autotools:pos2", {
initial_properties = {
visual = "cube",
visual_size = {x=1.1, y=1.1},
textures = {"pos2.png", "pos2.png",
"pos2.png", "pos2.png",
"pos2.png", "pos2.png"},
collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55},
physical = false,
static_save = false,
},
on_activate = function(self, staticdata, dtime_s)
end,
on_punch = function(self,hitter)
end,
on_blast = function(self, damage)
return false, false, {} -- don't damage or knockback
end,
})
minetest.register_entity(":mesecons_autotools:wall", {
initial_properties = {
visual = "upright_sprite",
textures = {"wall.png"},
visual_size = {x=10, y=10},
physical = false,
static_save = false,
},
on_activate = function(self, staticdata, dtime_s)
end,
on_punch = function(self,hitter)
end,
on_blast = function(self, damage)
return false, false, {} -- don't damage or knockback
end,
})
minetest.register_entity(":mesecons_autotools:pos", {
initial_properties = {
visual = "cube",
visual_size = {x=1.1, y=1.1},
textures = {"pos.png", "pos.png",
"pos.png", "pos.png",
"pos.png", "pos.png"},
collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55},
physical = false,
static_save = false,
},
on_activate = function(self, staticdata, dtime_s)
end,
on_punch = function(self,hitter)
end,
on_blast = function(self, damage)
return false, false, {} -- don't damage or knockback
end,
})
--[[ not used: TODO remove
local function generate_corners(user)
local pos = {}
pos[1] = mesecons_autotools.get_pos(user,1)
pos[2] = mesecons_autotools.get_pos(user,2)
if pos[1] == nil then return end
if pos[2] == nil then return end
local list = {}
for xi = 1,2 do
for yi = 1,2 do
for zi = 1,2 do
local p = { x = pos[xi].x , y = pos[yi].y , z = pos[zi].z }
if not vector.equals(p,pos[1]) then
table.insert(list,p)
end
end
end
end
return list
end
]]--
local function show_selection(user)
local pos1 = mesecons_autotools.get_pos(user,1)
local pos2 = mesecons_autotools.get_pos(user,2)
if pos1 ~= nil then
local e1 = minetest.add_entity(pos1,"mesecons_autotools:pos1")
table.insert(mesecons_autotools.users[user].entities, e1)
end
if pos2 ~= nil then
local e2 = minetest.add_entity(pos2,"mesecons_autotools:pos2")
table.insert(mesecons_autotools.users[user].entities, e2)
end
end
mesecons_autotools.render = function(user)
clear_selection(user)
show_selection(user)
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Some files were not shown because too many files have changed in this diff Show More