diff --git a/blocks/cable.lua b/blocks/cable.lua index 51f418c..8deca39 100644 --- a/blocks/cable.lua +++ b/blocks/cable.lua @@ -1,110 +1,3 @@ ---[[ - cable_NS1 -> One connection from north to south - cable_NW1_ES1 -> One connection from north to west, and another from east to south - cable_NWE8_S8 -> One connection between north, west and east, 8bit single cable from south - cable_0 -> The one cable without connection ---]] - -local nodebox_single = { - {-0.0625, -0.5, 0.25, 0.0625, -0.375, 0.5}, - {-0.125, -0.5, 0.25, 0.125, -0.25, 0.5} -} -local nodebox_straight = { - {-0.0625, -0.5, -0.5, 0.0625, -0.375, 0.5}, - {-0.125, -0.5, -0.5, 0.125, -0.25, 0.5} -} -local nodeboxes_corner = { - { - {-0.5, -0.5, -0.0625, 0.0625, -0.375, 0.0625}, -- NodeBox1 - {-0.0625, -0.5, 0.0625, 0.0625, -0.375, 0.5}, -- NodeBox2 - }, - { - {-0.5, -0.5, -0.125, 0.125, -0.25, 0.125}, -- NodeBox1 - {-0.125, -0.5, 0.125, 0.125, -0.25, 0.5}, -- NodeBox2 - } -} -local nodeboxes_jump = { - { - {-0.5, -0.5, -0.0625, -0.1875, -0.375, 0.0625}, -- NodeBox2 - {0.1875, -0.5, -0.0625, 0.5, -0.375, 0.0625}, -- NodeBox3 - {-0.3125, -0.1875, -0.0625, 0.3125, -0.0625, 0.0625}, -- NodeBox4 - {-0.3125, -0.375, -0.0625, -0.1875, -0.1875, 0.0625}, -- NodeBox5 - {0.1875, -0.375, -0.0625, 0.3125, -0.1875, 0.0625}, -- NodeBox6 - }, - { - {-0.5, -0.5, -0.125, -0.1875, -0.25, 0.125}, -- NodeBox2 - {0.1875, -0.5, -0.125, 0.5, -0.25, 0.125}, -- NodeBox3 - {-0.4375, -0.1875, -0.125, 0.4375, 0.0625, 0.125}, -- NodeBox4 - {-0.4375, -0.25, -0.125, -0.1875, -0.1875, 0.125}, -- NodeBox5 - {0.1875, -0.25, -0.125, 0.4375, -0.1875, 0.125}, -- NodeBox6 - } -} -local nodeboxes_ccorner = { - { - {-0.5, -0.5, -0.0625, -0.1875, -0.375, 0.0625}, -- NodeBox1 - {-0.0625, -0.5, 0.1875, 0.0625, -0.375, 0.5}, -- NodeBox2 - {-0.3125, -0.5, 0.0625, -0.1875, -0.375, 0.3125}, -- NodeBox3 - {-0.1875, -0.5, 0.1875, -0.0625, -0.375, 0.3125}, -- NodeBox4 - }, - { - {-0.5, -0.5, -0.125, -0.125, -0.25, 0.125}, -- NodeBox1 - {-0.125, -0.5, 0.125, 0.125, -0.25, 0.5}, -- NodeBox2 - {-0.375, -0.5, 0.125, -0.125, -0.25, 0.375}, -- NodeBox4 - } -} -local nodeboxes_tri = { - { - {-0.5, -0.5, -0.0625, 0.5, -0.375, 0.0625}, -- NodeBox1 - {-0.0625, -0.5, 0.0625, 0.0625, -0.375, 0.5}, -- NodeBox2 - }, - { - {-0.5, -0.5, -0.125, 0.5, -0.25, 0.125}, -- NodeBox1 - {-0.125, -0.5, 0.125, 0.125, -0.25, 0.5}, -- NodeBox2 - } -} -local nodeboxes_cross = { - { - {-0.5, -0.5, -0.0625, 0.5, -0.375, 0.0625}, -- NodeBox1 - {-0.0625, -0.5, 0.0625, 0.0625, -0.375, 0.5}, -- NodeBox2 - {-0.0625, -0.5, -0.5, 0.0625, -0.375, -0.0625}, -- NodeBox3 - }, - { - {-0.5, -0.5, -0.125, 0.5, -0.25, 0.125}, -- NodeBox1 - {-0.125, -0.5, 0.125, 0.125, -0.25, 0.5}, -- NodeBox2 - {-0.125, -0.5, -0.5, 0.125, -0.25, -0.125}, -- NodeBox3 - } -} - -local nodebox_disconnected = {-0.125, -0.5, -0.125, 0.125, -0.25, 0.125} - -local function rotateNodebox(nb,rot) - return - (math.fmod(rot,4)==0) and {nb[1],nb[2],nb[3],nb[4],nb[5],nb[6]} or - (math.fmod(rot,4)==1) and {nb[3],nb[2],-nb[1],nb[6],nb[5],-nb[4]} or - (math.fmod(rot,4)==2) and {-nb[1],nb[2],-nb[3],-nb[4],nb[5],-nb[6]} or - (math.fmod(rot,4)==3) and {-nb[3],nb[2],nb[1],-nb[6],nb[5],nb[4]} or - nb -- Should not happen -end -local function rotate4dir(conn,r) - local function rotate4dirOnce(conn) - return math.floor(conn/2) + 8*math.fmod(conn,2) - end - local x = math.fmod(conn,16) - for i=1,r do - x = rotate4dirOnce(x) - end - return (conn - math.fmod(conn,16) + x) -end - -local function constArray(val,size) - local t = {} - for i=1,size - do - table.insert(t,val) - end - return t -end - --[[ name: the name of the cable nodeboxes: All the rendered nodeboxes @@ -113,12 +6,12 @@ end nbconn: Which correspond each nodebox correspond to ex: {1,1,2,1} -> nodeboxes 1,2,3 correspond to connection ES, and nodebox 2 correspond to connection W --]] -logikraft.cablesblocks = {} -logikraft.cablesnb = {} -logikraft.cablesconn = {} -logikraft.cablesnbconn = {} -local function createCables(name,nodeboxes,connections,nbconn) - minetest.register_node("logikraft:cable_"..name, { +logikraft.cablenodes = {} +logikraft.cables = {} +function logikraft.registerCable(name,nodeboxes,connections,nbconn) + local nodename = "logikraft:cable_"..name + + minetest.register_node(nodename, { tiles = { "cable_gray.png", "cable_gray.png", @@ -127,8 +20,8 @@ local function createCables(name,nodeboxes,connections,nbconn) "cable_gray.png", "cable_gray.png", }, - drawtype = "nodebox", paramtype = "light", + drawtype = "nodebox", node_box = { type = "fixed", fixed = nodeboxes @@ -136,9 +29,6 @@ local function createCables(name,nodeboxes,connections,nbconn) groups = {circuitry = 1,dig_immediate = 3} }) - if name == "EW8_N1_S1" - then print(dump(connections)) end - -- We sort the connections and nbconn local connections2 = table.copy(connections) table.sort(connections2) @@ -148,209 +38,40 @@ local function createCables(name,nodeboxes,connections,nbconn) do nbconn2[i] = perm[v] end - if name == "EW8_N1_S1" - then print(dump(connections2)) end - logikraft.cablesblocks["logikraft:cable_"..name] = name - logikraft.cablesnb[name] = nodeboxes - logikraft.cablesconn[name] = connections2 - logikraft.cablesnbconn[name] = nbconn2 + logikraft.cablenodes[nodename] = name + logikraft.cables[name] = { + nbs = nodeboxes, + conns = connections2, + nbToConn = nbconn2 + } end --- cable_NSEW0 -for v=1,2 do - createCables("NSEW"..tostring((v-1)*7+1),nodeboxes_cross[v],{(v-1)*16+8+4+2+1},constArray(1,#nodeboxes_cross[v])) -end - ---[ --- cable_NW0_SE0 --- cable_NE0_SW0 --- cable_NS0_EW0 -for v0=1,2 do -for v1=1,2 do - local nodeboxes = {} - local nbconn = {} - for _,nb in ipairs(nodeboxes_ccorner[v0]) do - table.insert(nodeboxes, nb) - table.insert(nbconn, 1) - end - for _,nb in ipairs(nodeboxes_ccorner[v1]) do - table.insert(nodeboxes, rotateNodebox(nb,2)) - table.insert(nbconn, 2) - end - createCables("NW"..tostring((v0-1)*7+1).."_SE"..tostring((v1-1)*7+1),nodeboxes,{(v0-1)*16+8+1,(v1-1)*16+4+2},nbconn) - - local nodeboxes = {} - local nbconn = {} - for _,nb in ipairs(nodeboxes_ccorner[v0]) do - table.insert(nodeboxes, rotateNodebox(nb,1)) - table.insert(nbconn, 1) - end - for _,nb in ipairs(nodeboxes_ccorner[v1]) do - table.insert(nodeboxes, rotateNodebox(nb,3)) - table.insert(nbconn, 2) - end - createCables("NE"..tostring((v0-1)*7+1).."_SW"..tostring((v1-1)*7+1),nodeboxes,{(v0-1)*16+8+4,(v1-1)*16+2+1},nbconn) - - local nodeboxes = {} - local nbconn = {} - table.insert(nodeboxes, nodebox_straight[v0]) - table.insert(nbconn, 1) - for _,nb in ipairs(nodeboxes_jump[v1]) do - table.insert(nodeboxes, rotateNodebox(nb,2)) - table.insert(nbconn, 2) - end - createCables("NS"..tostring((v0-1)*7+1).."_EW"..tostring((v1-1)*7+1),nodeboxes,{(v0-1)*16+8+2,(v1-1)*16+4+1},nbconn) -end -end - --- cable_AB0_C0_D0 -- ("NW","NE","SE","SW") * (/ + C0 + D0 + C0D0) --- cable_AB0_C0_D0 -- ("NS" "EW") * (/ + C0 + D0 + C0D0) -for v=1,2 do -for v1=0,2 do -for v2=0,2 do - for r,rn in ipairs({{"NW","E","S"},{"NE","S","W"},{"SE","W","N"},{"SW","N","E"}}) do - local nodeboxes = {} - local nbconn = {} - local connz = {rotate4dir((v-1)*16+8+1,r-1)} - for _,nb in ipairs(nodeboxes_corner[v]) do - table.insert(nodeboxes, rotateNodebox(nb,r-1)) - table.insert(nbconn, 1) +function logikraft.cableFromConns(conns) + for name,cable in pairs(logikraft.cables) + do + if table.equals1(conns,cable.conns) + then return name end - if v1 ~= 0 then - table.insert(nodeboxes, rotateNodebox(nodebox_single[v1],r)) - table.insert(nbconn, 2) - table.insert(connz,rotate4dir((v1-1)*16+4,r-1)) - end - if v2 ~= 0 then - table.insert(nodeboxes, rotateNodebox(nodebox_single[v2],r+1)) - table.insert(nbconn, v1==0 and 2 or 3) - table.insert(connz,rotate4dir((v2-1)*16+2,r-1)) - end - createCables( - rn[1]..tostring((v-1)*7+1).. - (v1~=0 and ("_"..rn[2]..tostring((v1-1)*7+1)) or "").. - (v2~=0 and ("_"..rn[3]..tostring((v2-1)*7+1)) or "") - ,nodeboxes,connz,nbconn - ) - end - - for r,rn in ipairs({{"NS","E","W"},{"EW","N","S"}}) do - local nodeboxes = {} - local nbconn = {} - local connz = {rotate4dir((v-1)*16+8+2,r-1)} - table.insert(nodeboxes, rotateNodebox(nodebox_straight[v],r-1)) - table.insert(nbconn, 1) - if v1 ~= 0 then - table.insert(nodeboxes, rotateNodebox(nodebox_single[v1],r)) - table.insert(nbconn, 2) - table.insert(connz,rotate4dir((v1-1)*16+4,r-1)) - end - if v2 ~= 0 then - table.insert(nodeboxes, rotateNodebox(nodebox_single[v2],r+2)) - table.insert(nbconn, v1==0 and 2 or 3) - table.insert(connz,rotate4dir((v2-1)*16+1,r-1)) - end - createCables( - rn[1]..tostring((v-1)*7+1).. - (v1~=0 and ("_"..rn[2]..tostring((v1-1)*7+1)) or "").. - (v2~=0 and ("_"..rn[3]..tostring((v2-1)*7+1)) or ""), - nodeboxes,connz,nbconn - ) end + return nil end -end -end - --- "cable_A0_B0_C0_D0" -- (n s e w ns ...) -for v1=0,2 do -for v2=0,2 do -for v3=0,2 do -for v4=0,2 do - - local nodeboxes = {} - local nbconn = {} - local name = "" - local connz = {} - if v1 ~= 0 then - table.insert(nodeboxes, rotateNodebox(nodebox_single[v1],0)) - table.insert(nbconn, 1) - table.insert(connz,(v1-1)*16+8) - name = name.."_N"..tostring((v1-1)*7+1) - end - if v2 ~= 0 then - table.insert(nodeboxes, rotateNodebox(nodebox_single[v2],1)) - table.insert(nbconn, #nbconn+1) - table.insert(connz,(v2-1)*16+4) - name = name.."_E"..tostring((v2-1)*7+1) - end - if v3 ~= 0 then - table.insert(nodeboxes, rotateNodebox(nodebox_single[v3],2)) - table.insert(nbconn, #nbconn+1) - table.insert(connz,(v3-1)*16+2) - name = name.."_S"..tostring((v3-1)*7+1) - end - if v4 ~= 0 then - table.insert(nodeboxes, rotateNodebox(nodebox_single[v4],3)) - table.insert(nbconn, #nbconn+1) - table.insert(connz,(v4-1)*16+1) - name = name.."_W"..tostring((v4-1)*7+1) - end - if name ~= "" then - -- Else there is no connection, we don't have to create a cable - createCables(string.sub(name,2,-1),nodeboxes,connz,nbconn) - end - - -end -end -end -end - --- "cable_ABC0_D0" -- ("NEW","NES","ESW","SWN") * (/ + D0) -for v=1,2 do -for v1=0,2 do - for r,rn in ipairs({{"NEW","S"},{"NES","W"},{"ESW","N"},{"SWN","E"}}) do - local nodeboxes = {} - local nbconn = {} - local connz = {rotate4dir((v-1)*16+8+4+1,r-1)} - for _,nb in ipairs(nodeboxes_tri[v]) do - table.insert(nodeboxes, rotateNodebox(nb,r-1)) - table.insert(nbconn, 1) - end - if v1 ~= 0 then - table.insert(nodeboxes, rotateNodebox(nodebox_single[v1],r+1)) - table.insert(nbconn, 2) - table.insert(connz,rotate4dir((v1-1)*16+2,r-1)) - end - createCables( - rn[1]..tostring((v-1)*7+1).. - (v1~=0 and ("_"..rn[2]..tostring((v1-1)*7+1)) or ""), - nodeboxes,connz,nbconn - ) - end -end -end ---]] - -logikraft.cablesfromconn = table.invert(logikraft.cablesconn) - function logikraft.rotateCable(name,r) - local conn = logikraft.cablesconn[name] + local conn = logikraft.cables[name].conns local newconn = {} for i,v in ipairs(conn) do newconn[i] = rotate4dir(v,r) end table.sort(newconn) - return table.getkey1(logikraft.cablesconn,newconn) + return logikraft.cableFromConns(newconn) end function logikraft.connectInCable(name,a,b) - local conns = table.copy(logikraft.cablesconn[name]) - local cia = logikraft.cablesnbconn[name][a] - local cib = logikraft.cablesnbconn[name][b] + local conns = table.copy(logikraft.cables[name].conns) + local cia = logikraft.cables[name].nbToConn[a] + local cib = logikraft.cables[name].nbToConn[b] local conna = conns[cia] local connb = conns[cib] @@ -360,11 +81,11 @@ function logikraft.connectInCable(name,a,b) table.remove(conns,cib) table.sort(conns) - return table.getkey1(logikraft.cablesconn,conns) + return logikraft.cableFromConns(conns) end function logikraft.connFromDir(name,dir) - local conns = logikraft.cablesconn[name] + local conns = logikraft.cables[name].conns local dir8 = math.pow(2,dir) for i,c in ipairs(conns) do @@ -391,12 +112,12 @@ function logikraft.connectContiguousCable(namea,posa,a,nameb,posb,b) then return nil end - local connsa = table.copy(logikraft.cablesconn[namea]) - local connsb = table.copy(logikraft.cablesconn[nameb]) + local connsa = table.copy(logikraft.cables[namea].conns) + local connsb = table.copy(logikraft.cables[nameb].conns) print(dump(connsa)) print(dump(connsb)) - local cia = logikraft.cablesnbconn[namea][a] - local cib = logikraft.cablesnbconn[nameb][b] + local cia = logikraft.cables[namea].nbToConn[a] + local cib = logikraft.cables[nameb].nbToConn[b] local cia2 = logikraft.connFromDir(namea,dira) local cib2 = logikraft.connFromDir(nameb,math.fmod(dira+2,4)) print(dira) @@ -434,13 +155,13 @@ function logikraft.connectContiguousCable(namea,posa,a,nameb,posb,b) table.sort(connsa) table.sort(connsb) - return {table.getkey1(logikraft.cablesconn,connsa),table.getkey1(logikraft.cablesconn,connsb)} + return {logikraft.cableFromConns(connsa),logikraft.cableFromConns(connsb)} end function logikraft.disconnectInCable(name,a) - local conns = table.copy(logikraft.cablesconn[name]) - local cindex = logikraft.cablesnbconn[name][a] + local conns = table.copy(logikraft.cables[name].conns) + local cindex = logikraft.cables[name].nbToConn[a] local conn = conns[cindex] table.remove(conns,cindex) @@ -458,15 +179,15 @@ function logikraft.disconnectInCable(name,a) end table.sort(conns) - return table.getkey1(logikraft.cablesconn,conns) + return logikraft.cableFromConns(conns) end function logikraft.resizeInCable(name,a) - local conns = table.copy(logikraft.cablesconn[name]) - local cindex = logikraft.cablesnbconn[name][a] + local conns = table.copy(logikraft.cables[name].conns) + local cindex = logikraft.cables[name].nbToConn[a] conns[cindex] = (conns[cindex] >= 16) and (conns[cindex] - 16) or (conns[cindex] + 16) table.sort(conns) - return table.getkey1(logikraft.cablesconn,conns) + return logikraft.cableFromConns(conns) end \ No newline at end of file diff --git a/blocks/cables_register.lua b/blocks/cables_register.lua new file mode 100644 index 0000000..ab93737 --- /dev/null +++ b/blocks/cables_register.lua @@ -0,0 +1,253 @@ +--[[ + cable_NS1 -> One connection from north to south + cable_NW1_ES1 -> One connection from north to west, and another from east to south + cable_NWE8_S8 -> One connection between north, west and east, 8bit single cable from south + cable_0 -> The one cable without connection +--]] + +local nodebox_single = { + {-0.0625, -0.5, 0.25, 0.0625, -0.375, 0.5}, + {-0.125, -0.5, 0.25, 0.125, -0.25, 0.5} +} +local nodebox_straight = { + {-0.0625, -0.5, -0.5, 0.0625, -0.375, 0.5}, + {-0.125, -0.5, -0.5, 0.125, -0.25, 0.5} +} +local nodeboxes_corner = { + { + {-0.5, -0.5, -0.0625, 0.0625, -0.375, 0.0625}, -- NodeBox1 + {-0.0625, -0.5, 0.0625, 0.0625, -0.375, 0.5}, -- NodeBox2 + }, + { + {-0.5, -0.5, -0.125, 0.125, -0.25, 0.125}, -- NodeBox1 + {-0.125, -0.5, 0.125, 0.125, -0.25, 0.5}, -- NodeBox2 + } +} +local nodeboxes_jump = { + { + {-0.5, -0.5, -0.0625, -0.1875, -0.375, 0.0625}, -- NodeBox2 + {0.1875, -0.5, -0.0625, 0.5, -0.375, 0.0625}, -- NodeBox3 + {-0.3125, -0.1875, -0.0625, 0.3125, -0.0625, 0.0625}, -- NodeBox4 + {-0.3125, -0.375, -0.0625, -0.1875, -0.1875, 0.0625}, -- NodeBox5 + {0.1875, -0.375, -0.0625, 0.3125, -0.1875, 0.0625}, -- NodeBox6 + }, + { + {-0.5, -0.5, -0.125, -0.1875, -0.25, 0.125}, -- NodeBox2 + {0.1875, -0.5, -0.125, 0.5, -0.25, 0.125}, -- NodeBox3 + {-0.4375, -0.1875, -0.125, 0.4375, 0.0625, 0.125}, -- NodeBox4 + {-0.4375, -0.25, -0.125, -0.1875, -0.1875, 0.125}, -- NodeBox5 + {0.1875, -0.25, -0.125, 0.4375, -0.1875, 0.125}, -- NodeBox6 + } +} +local nodeboxes_ccorner = { + { + {-0.5, -0.5, -0.0625, -0.1875, -0.375, 0.0625}, -- NodeBox1 + {-0.0625, -0.5, 0.1875, 0.0625, -0.375, 0.5}, -- NodeBox2 + {-0.3125, -0.5, 0.0625, -0.1875, -0.375, 0.3125}, -- NodeBox3 + {-0.1875, -0.5, 0.1875, -0.0625, -0.375, 0.3125}, -- NodeBox4 + }, + { + {-0.5, -0.5, -0.125, -0.125, -0.25, 0.125}, -- NodeBox1 + {-0.125, -0.5, 0.125, 0.125, -0.25, 0.5}, -- NodeBox2 + {-0.375, -0.5, 0.125, -0.125, -0.25, 0.375}, -- NodeBox4 + } +} +local nodeboxes_tri = { + { + {-0.5, -0.5, -0.0625, 0.5, -0.375, 0.0625}, -- NodeBox1 + {-0.0625, -0.5, 0.0625, 0.0625, -0.375, 0.5}, -- NodeBox2 + }, + { + {-0.5, -0.5, -0.125, 0.5, -0.25, 0.125}, -- NodeBox1 + {-0.125, -0.5, 0.125, 0.125, -0.25, 0.5}, -- NodeBox2 + } +} +local nodeboxes_cross = { + { + {-0.5, -0.5, -0.0625, 0.5, -0.375, 0.0625}, -- NodeBox1 + {-0.0625, -0.5, 0.0625, 0.0625, -0.375, 0.5}, -- NodeBox2 + {-0.0625, -0.5, -0.5, 0.0625, -0.375, -0.0625}, -- NodeBox3 + }, + { + {-0.5, -0.5, -0.125, 0.5, -0.25, 0.125}, -- NodeBox1 + {-0.125, -0.5, 0.125, 0.125, -0.25, 0.5}, -- NodeBox2 + {-0.125, -0.5, -0.5, 0.125, -0.25, -0.125}, -- NodeBox3 + } +} + +local nodebox_disconnected = {-0.125, -0.5, -0.125, 0.125, -0.25, 0.125} + +-- cable_NSEW0 +for v=1,2 do + logikraft.registerCable("NSEW"..tostring((v-1)*7+1),nodeboxes_cross[v],{(v-1)*16+8+4+2+1},table.constTable(1,#nodeboxes_cross[v])) +end + +--[ +-- cable_NW0_SE0 +-- cable_NE0_SW0 +-- cable_NS0_EW0 +for v0=1,2 do +for v1=1,2 do + local nodeboxes = {} + local nbconn = {} + for _,nb in ipairs(nodeboxes_ccorner[v0]) do + table.insert(nodeboxes, nb) + table.insert(nbconn, 1) + end + for _,nb in ipairs(nodeboxes_ccorner[v1]) do + table.insert(nodeboxes, logikraft.rotateNodebox(nb,2)) + table.insert(nbconn, 2) + end + logikraft.registerCable("NW"..tostring((v0-1)*7+1).."_SE"..tostring((v1-1)*7+1),nodeboxes,{(v0-1)*16+8+1,(v1-1)*16+4+2},nbconn) + + local nodeboxes = {} + local nbconn = {} + for _,nb in ipairs(nodeboxes_ccorner[v0]) do + table.insert(nodeboxes, logikraft.rotateNodebox(nb,1)) + table.insert(nbconn, 1) + end + for _,nb in ipairs(nodeboxes_ccorner[v1]) do + table.insert(nodeboxes, logikraft.rotateNodebox(nb,3)) + table.insert(nbconn, 2) + end + logikraft.registerCable("NE"..tostring((v0-1)*7+1).."_SW"..tostring((v1-1)*7+1),nodeboxes,{(v0-1)*16+8+4,(v1-1)*16+2+1},nbconn) + + local nodeboxes = {} + local nbconn = {} + table.insert(nodeboxes, nodebox_straight[v0]) + table.insert(nbconn, 1) + for _,nb in ipairs(nodeboxes_jump[v1]) do + table.insert(nodeboxes, logikraft.rotateNodebox(nb,2)) + table.insert(nbconn, 2) + end + logikraft.registerCable("NS"..tostring((v0-1)*7+1).."_EW"..tostring((v1-1)*7+1),nodeboxes,{(v0-1)*16+8+2,(v1-1)*16+4+1},nbconn) +end +end + +-- cable_AB0_C0_D0 -- ("NW","NE","SE","SW") * (/ + C0 + D0 + C0D0) +-- cable_AB0_C0_D0 -- ("NS" "EW") * (/ + C0 + D0 + C0D0) +for v=1,2 do +for v1=0,2 do +for v2=0,2 do + for r,rn in ipairs({{"NW","E","S"},{"NE","S","W"},{"SE","W","N"},{"SW","N","E"}}) do + local nodeboxes = {} + local nbconn = {} + local connz = {logikraft.rotate4dir((v-1)*16+8+1,r-1)} + for _,nb in ipairs(nodeboxes_corner[v]) do + table.insert(nodeboxes, logikraft.rotateNodebox(nb,r-1)) + table.insert(nbconn, 1) + end + if v1 ~= 0 then + table.insert(nodeboxes, logikraft.rotateNodebox(nodebox_single[v1],r)) + table.insert(nbconn, 2) + table.insert(connz,logikraft.rotate4dir((v1-1)*16+4,r-1)) + end + if v2 ~= 0 then + table.insert(nodeboxes, logikraft.rotateNodebox(nodebox_single[v2],r+1)) + table.insert(nbconn, v1==0 and 2 or 3) + table.insert(connz,logikraft.rotate4dir((v2-1)*16+2,r-1)) + end + logikraft.registerCable( + rn[1]..tostring((v-1)*7+1).. + (v1~=0 and ("_"..rn[2]..tostring((v1-1)*7+1)) or "").. + (v2~=0 and ("_"..rn[3]..tostring((v2-1)*7+1)) or "") + ,nodeboxes,connz,nbconn + ) + end + + for r,rn in ipairs({{"NS","E","W"},{"EW","N","S"}}) do + local nodeboxes = {} + local nbconn = {} + local connz = {logikraft.rotate4dir((v-1)*16+8+2,r-1)} + table.insert(nodeboxes, logikraft.rotateNodebox(nodebox_straight[v],r-1)) + table.insert(nbconn, 1) + if v1 ~= 0 then + table.insert(nodeboxes, logikraft.rotateNodebox(nodebox_single[v1],r)) + table.insert(nbconn, 2) + table.insert(connz,logikraft.rotate4dir((v1-1)*16+4,r-1)) + end + if v2 ~= 0 then + table.insert(nodeboxes, logikraft.rotateNodebox(nodebox_single[v2],r+2)) + table.insert(nbconn, v1==0 and 2 or 3) + table.insert(connz,logikraft.rotate4dir((v2-1)*16+1,r-1)) + end + logikraft.registerCable( + rn[1]..tostring((v-1)*7+1).. + (v1~=0 and ("_"..rn[2]..tostring((v1-1)*7+1)) or "").. + (v2~=0 and ("_"..rn[3]..tostring((v2-1)*7+1)) or ""), + nodeboxes,connz,nbconn + ) + end +end +end +end + +-- "cable_A0_B0_C0_D0" -- (n s e w ns ...) +for v1=0,2 do +for v2=0,2 do +for v3=0,2 do +for v4=0,2 do + + local nodeboxes = {} + local nbconn = {} + local name = "" + local connz = {} + if v1 ~= 0 then + table.insert(nodeboxes, logikraft.rotateNodebox(nodebox_single[v1],0)) + table.insert(nbconn, 1) + table.insert(connz,(v1-1)*16+8) + name = name.."_N"..tostring((v1-1)*7+1) + end + if v2 ~= 0 then + table.insert(nodeboxes, logikraft.rotateNodebox(nodebox_single[v2],1)) + table.insert(nbconn, #nbconn+1) + table.insert(connz,(v2-1)*16+4) + name = name.."_E"..tostring((v2-1)*7+1) + end + if v3 ~= 0 then + table.insert(nodeboxes, logikraft.rotateNodebox(nodebox_single[v3],2)) + table.insert(nbconn, #nbconn+1) + table.insert(connz,(v3-1)*16+2) + name = name.."_S"..tostring((v3-1)*7+1) + end + if v4 ~= 0 then + table.insert(nodeboxes, logikraft.rotateNodebox(nodebox_single[v4],3)) + table.insert(nbconn, #nbconn+1) + table.insert(connz,(v4-1)*16+1) + name = name.."_W"..tostring((v4-1)*7+1) + end + if name ~= "" then + -- Else there is no connection, we don't have to create a cable + logikraft.registerCable(string.sub(name,2,-1),nodeboxes,connz,nbconn) + end + + +end +end +end +end + +-- "cable_ABC0_D0" -- ("NEW","NES","ESW","SWN") * (/ + D0) +for v=1,2 do +for v1=0,2 do + for r,rn in ipairs({{"NEW","S"},{"NES","W"},{"ESW","N"},{"SWN","E"}}) do + local nodeboxes = {} + local nbconn = {} + local connz = {logikraft.rotate4dir((v-1)*16+8+4+1,r-1)} + for _,nb in ipairs(nodeboxes_tri[v]) do + table.insert(nodeboxes, logikraft.rotateNodebox(nb,r-1)) + table.insert(nbconn, 1) + end + if v1 ~= 0 then + table.insert(nodeboxes, logikraft.rotateNodebox(nodebox_single[v1],r+1)) + table.insert(nbconn, 2) + table.insert(connz,logikraft.rotate4dir((v1-1)*16+2,r-1)) + end + logikraft.registerCable( + rn[1]..tostring((v-1)*7+1).. + (v1~=0 and ("_"..rn[2]..tostring((v1-1)*7+1)) or ""), + nodeboxes,connz,nbconn + ) + end +end +end \ No newline at end of file diff --git a/blocks/component.lua b/blocks/component.lua index 882c4c3..8f7028c 100644 --- a/blocks/component.lua +++ b/blocks/component.lua @@ -13,19 +13,41 @@ end -- +−−−−−−−−−−−> x+ -- {name,width,height,{cables_left,cables_right,cables_top,cables_bottom}} logikraft.components = { - ["and"] = {2,3,{{"in_2",nil,"in_1"},{nil,"out",nil},nil,nil}}, - ["switch"] = {2,1,{{"in"},{"out"},{"activate",nil},nil}}, - ["demux"] = {2,8,{{nil,nil,nil,nil,nil,"in_3","in_2","in_1"},{"out_8","out_7","out_6","out_5","out_4","out_3","out_2","out_1"},nil,nil}} + ["and"] = { + width = 2, + height = 3, + ports = { + left = {"in_2",nil,"in_1"}, + right = {nil,"out",nil} + } + }, + ["switch"] = { + width = 2, + height = 1, + ports = { + left = {"in"}, + right = {"out"}, + top = {"activate",nil} + } + }, + ["demux"] = { + width = 2, + height = 8, + ports = { + left = {nil,nil,nil,nil,nil,"in_3","in_2","in_1"}, + right = {"out_8","out_7","out_6","out_5","out_4","out_3","out_2","out_1"} + } + } } --- componentsblocks["block"] = {name,x,y} -logikraft.componentsblocks = {} +-- componentsblocks["block"] = {name = Name of the component,x,y} +logikraft.componentnodes = {} for name,cmp in pairs(logikraft.components) do - local w = cmp[1] - local h = cmp[2] - local cables = cmp[3] + local w = cmp.width + local h = cmp.height + local cables = cmp.ports for x=1,w do for y=1,h do @@ -36,10 +58,10 @@ do tiles = { "component_"..name..".png", "component.png", - ((x==w) and (cables[2] and cables[2][y] and "component_port.png" or "component.png") or "component.png"), -- x+ - ((x==1) and (cables[1] and cables[1][y] and "component_port.png" or "component.png") or "component.png"), -- x- - ((y==h) and (cables[3] and cables[3][x] and "component_port.png" or "component.png") or "component.png"), -- z+ - ((y==1) and (cables[4] and cables[4][x] and "component_port.png" or "component.png") or "component.png"), -- z- + ((x==w) and (cables.right and cables.right[y] and "component_port.png" or "component.png") or "component.png"), -- x+ + ((x==1) and (cables.left and cables.left[y] and "component_port.png" or "component.png") or "component.png"), -- x- + ((y==h) and (cables.top and cables.top[x] and "component_port.png" or "component.png") or "component.png"), -- z+ + ((y==1) and (cables.bottom and cables.bottom[x] and "component_port.png" or "component.png") or "component.png"), -- z- }, groups = {circuitry = 1,dig_immediate = 3}, paramtype2 = "4dir", @@ -109,7 +131,7 @@ do end end }) - logikraft.componentsblocks[nodename] = {name = name, x = x, y = y} + logikraft.componentnodes[nodename] = {name = name, x = x, y = y} end end diff --git a/circuits.lua b/circuits.lua index 13cc66f..744900c 100644 --- a/circuits.lua +++ b/circuits.lua @@ -90,10 +90,10 @@ function logikraft.compileCircuit(poz) do local node = minetest.get_node(pos) print("Analyzing "..node.name) - if logikraft.cablesblocks[node.name] + if logikraft.cablenodes[node.name] then -- It is a cable - local conns = logikraft.cablesconn[logikraft.cablesblocks[node.name]] + local conns = logikraft.cables[logikraft.cablenodes[node.name]].conns for j,c in ipairs(conns) do if not (c == 1 or c == 2 or c == 4 or c == 8 or c == 17 or c == 18 or c == 20 or c == 24) @@ -110,19 +110,18 @@ function logikraft.compileCircuit(poz) table.insert(connections,newconn) end end - elseif logikraft.componentsblocks[node.name] + elseif logikraft.componentnodes[node.name] then -- It is a component - local cpblock = logikraft.componentsblocks[node.name] + local cpblock = logikraft.componentnodes[node.name] if cpblock.x == 1 and cpblock.y == 1 then local component = logikraft.components[cpblock.name] local cp = {type = cpblock.name, ports = {}} - print(dump(component)) -- Left - if component[3][1] + if component.ports.left then - for j,n in pairs(component[3][1]) + for j,n in pairs(component.ports.left) do if n then @@ -131,31 +130,31 @@ function logikraft.compileCircuit(poz) end end -- Right - if component[3][2] + if component.ports.right then - for j,n in pairs(component[3][2]) + for j,n in pairs(component.ports.right) do if n then - cp.ports[n] = {x=pos.x+component[1]-1,y=pos.y,z=pos.z+j-1,d=0} + cp.ports[n] = {x=pos.x+component.width-1,y=pos.y,z=pos.z+j-1,d=0} end end end -- Top - if component[3][3] + if component.ports.top then - for j,n in pairs(component[3][3]) + for j,n in pairs(component.ports.top) do if n then - cp.ports[n] = {x=pos.x+j-1,y=pos.y,z=pos.z+component[2]-1,d=1} + cp.ports[n] = {x=pos.x+j-1,y=pos.y,z=pos.z+component.height-1,d=1} end end end -- Bottom - if component[3][4] + if component.ports.bottom then - for j,n in pairs(component[3][4]) + for j,n in pairs(component.ports.bottom) do if n then diff --git a/init.lua b/init.lua index c5148cc..b6de4d9 100644 --- a/init.lua +++ b/init.lua @@ -6,6 +6,7 @@ dofile(minetest.get_modpath("logikraft") .. "/circuits.lua") dofile(minetest.get_modpath("logikraft") .. "/blocks/circuit.lua") dofile(minetest.get_modpath("logikraft") .. "/blocks/component.lua") dofile(minetest.get_modpath("logikraft") .. "/blocks/cable.lua") +dofile(minetest.get_modpath("logikraft") .. "/blocks/cables_register.lua") dofile(minetest.get_modpath("logikraft") .. "/items.lua") minetest.register_on_joinplayer(function(player) diff --git a/items.lua b/items.lua index 476439f..20321b0 100644 --- a/items.lua +++ b/items.lua @@ -3,11 +3,11 @@ minetest.register_craftitem("logikraft:rotator", { inventory_image = "rotator.png", on_place = function(itemstack, user, pointed_thing) local node = minetest.get_node(pointed_thing.under) - if not logikraft.cablesblocks[node.name] + if not logikraft.cablenodes[node.name] then return itemstack end - local new = logikraft.rotateCable(logikraft.cablesblocks[node.name],1) + local new = logikraft.rotateCable(logikraft.cablenodes[node.name],1) minetest.swap_node(pointed_thing.under, {name = "logikraft:cable_" .. new}) return itemstack end @@ -25,14 +25,14 @@ minetest.register_craftitem("logikraft:linker", { local selectedy = meta:get_int("logikraft:selected_y") local selectedz = meta:get_int("logikraft:selected_z") local selectedpos = {x = selectedx, y = selectedy, z = selectedz} - if logikraft.cablesblocks[node.name] + if logikraft.cablenodes[node.name] then if selectedx == pointed_thing.under.x and selectedy == pointed_thing.under.y and selectedz == pointed_thing.under.z then local thisnb = logikraft.lookingAtNbIndex(user,pointed_thing.under) if(selectednb ~= thisnb) then - local new = logikraft.connectInCable(logikraft.cablesblocks[node.name],selectednb,thisnb) + local new = logikraft.connectInCable(logikraft.cablenodes[node.name],selectednb,thisnb) minetest.swap_node(pointed_thing.under, {name = "logikraft:cable_" .. new}) end meta:set_int("logikraft:selected_nb",0) @@ -40,8 +40,8 @@ minetest.register_craftitem("logikraft:linker", { else local thisnb = logikraft.lookingAtNbIndex(user,pointed_thing.under) local new = logikraft.connectContiguousCable( - logikraft.cablesblocks[minetest.get_node(selectedpos).name],selectedpos,selectednb, - logikraft.cablesblocks[node.name],pointed_thing.under,thisnb) + logikraft.cablenodes[minetest.get_node(selectedpos).name],selectedpos,selectednb, + logikraft.cablenodes[node.name],pointed_thing.under,thisnb) if new then minetest.swap_node(selectedpos, {name = "logikraft:cable_" .. new[1]}) @@ -63,7 +63,7 @@ minetest.register_craftitem("logikraft:linker", { meta:set_string("inventory_image","linker.png") end else - if logikraft.cablesblocks[node.name] + if logikraft.cablenodes[node.name] then -- If we are looking at a cable we activate and store data meta:set_int("logikraft:selected_nb",logikraft.lookingAtNbIndex(user,pointed_thing.under)) @@ -97,13 +97,14 @@ minetest.register_craftitem("logikraft:unlinker", { inventory_image = "unlinker.png", on_place = function(itemstack, user, pointed_thing) local node = minetest.get_node(pointed_thing.under) - if not logikraft.cablesblocks[node.name] + if not logikraft.cablenodes[node.name] then return itemstack end local index = logikraft.lookingAtNbIndex(user,pointed_thing.under) - - local new = logikraft.disconnectInCable(logikraft.cablesblocks[node.name],index) + print(logikraft.cablenodes[node.name]) + print(dump(logikraft.cables[logikraft.cablenodes[node.name]])) + local new = logikraft.disconnectInCable(logikraft.cablenodes[node.name],index) if new then minetest.swap_node(pointed_thing.under, {name = "logikraft:cable_" .. new}) else minetest.remove_node(pointed_thing.under) @@ -117,15 +118,33 @@ minetest.register_craftitem("logikraft:resizer", { inventory_image = "resizer.png", on_place = function(itemstack, user, pointed_thing) local node = minetest.get_node(pointed_thing.under) - if not logikraft.cablesblocks[node.name] + if not logikraft.cablenodes[node.name] then return itemstack end local index = logikraft.lookingAtNbIndex(user,pointed_thing.under) - local new = logikraft.resizeInCable(logikraft.cablesblocks[node.name],index) + local new = logikraft.resizeInCable(logikraft.cablenodes[node.name],index) minetest.swap_node(pointed_thing.under, {name = "logikraft:cable_" .. new}) + return itemstack + end +}) + +minetest.register_craftitem("logikraft:editor", { + description = "The Editor", + inventory_image = "editor.png", + on_place = function(itemstack, user, pointed_thing) + local node = minetest.get_node(pointed_thing.under) + if logikraft.cablenodes[node.name] + then + local index = logikraft.lookingAtNbIndex(user,pointed_thing.under) + minetest.chat_send_all("Looking at nodeblock "..tostring(index)) + elseif logikraft.componentnodes[node.name] + then + minetest.chat_send_all("Looking at component "..logikraft.componentnodes[node.name].name) + end + return itemstack end }) \ No newline at end of file diff --git a/textures/editor.png b/textures/editor.png new file mode 100644 index 0000000..39d5c94 Binary files /dev/null and b/textures/editor.png differ diff --git a/utils.lua b/utils.lua index 25816b8..1c41718 100644 --- a/utils.lua +++ b/utils.lua @@ -68,7 +68,7 @@ function logikraft.nearestNodeboxIndex(nodeboxes,point) end function logikraft.lookingAtNbIndex(user,under) - local range=5 + local range=15 local eye = vector.add(user:get_pos(),{x=0,y=1.625,z=0}) local objective = vector.add(eye, vector.multiply(user:get_look_dir(),range)) local ray = minetest.raycast(eye,objective,false,false) @@ -149,4 +149,32 @@ function table.findMatch1(ta,tb) end return nil end - \ No newline at end of file + + +function logikraft.rotateNodebox(nb,rot) + return + (math.fmod(rot,4)==0) and {nb[1],nb[2],nb[3],nb[4],nb[5],nb[6]} or + (math.fmod(rot,4)==1) and {nb[3],nb[2],-nb[1],nb[6],nb[5],-nb[4]} or + (math.fmod(rot,4)==2) and {-nb[1],nb[2],-nb[3],-nb[4],nb[5],-nb[6]} or + (math.fmod(rot,4)==3) and {-nb[3],nb[2],nb[1],-nb[6],nb[5],nb[4]} or + nb -- Should not happen +end +function logikraft.rotate4dir(conn,r) + local function rotate4dirOnce(conn) + return math.floor(conn/2) + 8*math.fmod(conn,2) + end + local x = math.fmod(conn,16) + for i=1,r do + x = rotate4dirOnce(x) + end + return (conn - math.fmod(conn,16) + x) +end + +function table.constTable(val,size) + local t = {} + for i=1,size + do + table.insert(t,val) + end + return t +end \ No newline at end of file