2024-01-24 12:51:15 -05:00
elements . output = {
color : "#601616" ,
category : "logic" ,
state : "solid" ,
behavior : behaviors . WALL ,
conduct : 1 ,
tick : function ( pixel ) {
for ( var i = 0 ; i < adjacentCoords . length ; i ++ ) {
var coord = adjacentCoords [ i ] ;
var x = pixel . x + coord [ 0 ] ;
var y = pixel . y + coord [ 1 ] ;
if ( ! isEmpty ( x , y , true ) && pixel . charged ) {
if ( pixelMap [ x ] [ y ] . element == "logic_wire" && pixelMap [ x ] [ y ] . lstate == 0 ) {
if ( pixelMap [ x ] [ y ] . lastUpdate == pixelTicks ) {
pixelMap [ x ] [ y ] . lstate = 2
} else {
pixelMap [ x ] [ y ] . lstate = 1
}
}
}
}
}
}
elements . logic _wire = {
color : "#3d4d2c" ,
behavior : behaviors . WALL ,
state : "solid" ,
category : "logic" ,
tick : function ( pixel ) { // -2 uncharge spread -1 uncharge buffer 0 uncharged 1 charge buffer 2 charge spread
pixel . lastUpdate = pixelTicks
if ( ! pixel . lstate ) {
pixel . lstate = 0
}
if ( pixel . lstate == 0 ) {
for ( var i = 0 ; i < adjacentCoords . length ; i ++ ) {
var coord = adjacentCoords [ i ] ;
var x = pixel . x + coord [ 0 ] ;
var y = pixel . y + coord [ 1 ] ;
if ( ! isEmpty ( x , y , true ) ) {
if ( pixelMap [ x ] [ y ] . element == "output" && pixelMap [ x ] [ y ] . charge == 1 ) {
2024-07-02 11:49:59 -04:00
pixel . lstate = 2 ;
2024-01-24 12:51:15 -05:00
}
}
}
}
if ( pixel . lstate == 2 ) {
for ( var i = 0 ; i < adjacentCoords . length ; i ++ ) {
var coord = adjacentCoords [ i ] ;
var x = pixel . x + coord [ 0 ] ;
var y = pixel . y + coord [ 1 ] ;
if ( ! isEmpty ( x , y , true ) ) {
if ( pixelMap [ x ] [ y ] . element == "logic_wire" && pixelMap [ x ] [ y ] . lstate == 0 ) {
if ( pixelMap [ x ] [ y ] . lastUpdate == pixelTicks ) {
pixelMap [ x ] [ y ] . lstate = 2
2025-09-06 09:48:46 -04:00
pixelMap [ x ] [ y ] . color = "rgb(255, 228, 156)"
2024-01-24 12:51:15 -05:00
} else {
pixelMap [ x ] [ y ] . lstate = 1
}
} else if ( pixelMap [ x ] [ y ] . element == "output" && pixelMap [ x ] [ y ] . charged == 0 ) {
pixel . lstate = - 2
}
}
}
}
if ( pixel . lstate == 1 ) {
2024-06-18 21:50:05 -04:00
// lightmap.js integration
if ( enabledMods . includes ( "mods/lightmap.js" ) ) {
let x = Math . floor ( pixel . x / lightmapScale ) ;
let y = Math . floor ( pixel . y / lightmapScale ) ;
lightmap [ y ] [ x ] = { color : [ 255 / 4 , 228 / 4 , 156 / 4 ] } ;
}
2024-01-24 12:51:15 -05:00
pixel . lstate = 2
pixel . color = pixelColorPick ( pixel , "#ffe49c" ) ;
}
if ( pixel . lstate == - 2 ) {
for ( var i = 0 ; i < adjacentCoords . length ; i ++ ) {
var coord = adjacentCoords [ i ] ;
var x = pixel . x + coord [ 0 ] ;
var y = pixel . y + coord [ 1 ] ;
if ( ! isEmpty ( x , y , true ) ) {
if ( pixelMap [ x ] [ y ] . element == "logic_wire" && ( pixelMap [ x ] [ y ] . lstate == 1 || pixelMap [ x ] [ y ] . lstate == 2 ) ) {
if ( pixelMap [ x ] [ y ] . lastUpdate == pixelTicks ) {
pixelMap [ x ] [ y ] . lstate = - 2
2025-09-06 09:48:46 -04:00
pixelMap [ x ] [ y ] . color = "rgb(61, 77, 44)"
2024-01-24 12:51:15 -05:00
} else {
pixelMap [ x ] [ y ] . lstate = - 1
}
}
}
}
pixel . lstate = 0
}
if ( pixel . lstate == - 1 ) {
pixel . lstate = - 2
2025-09-06 09:48:46 -04:00
}
if ( pixel . lstate > 0 ) {
pixel . color = "rgb(255, 228, 156)"
} else {
pixel . color = "rgb(61, 77, 44)"
2024-01-24 12:51:15 -05:00
}
}
}
2024-05-21 06:11:13 -04:00
function countNeighbors ( pixel ) {
2024-01-24 12:51:15 -05:00
var results = {
"charged" : 0 ,
"uncharged" : 0 ,
}
for ( var i = 0 ; i < squareCoords . length ; i ++ ) {
var coord = squareCoords [ i ] ;
var x = pixel . x + coord [ 0 ] ;
var y = pixel . y + coord [ 1 ] ;
if ( ! isEmpty ( x , y , true ) ) {
var otherPixel = pixelMap [ x ] [ y ] ;
if ( otherPixel . element == "logic_wire" ) {
2024-01-24 14:41:50 -05:00
if ( otherPixel . lstate > 0 ) {
2024-01-24 12:51:15 -05:00
results . charged = results . charged + 1 ;
} else {
results . uncharged = results . uncharged + 1 ;
}
}
}
}
return results ;
}
2024-05-21 06:11:13 -04:00
function chargeOutputs ( pixel ) {
2024-01-24 12:51:15 -05:00
for ( var i = 0 ; i < squareCoords . length ; i ++ ) {
var coord = squareCoords [ i ] ;
var x = pixel . x + coord [ 0 ] ;
var y = pixel . y + coord [ 1 ] ;
if ( ! isEmpty ( x , y , true ) ) {
var otherPixel = pixelMap [ x ] [ y ] ;
if ( otherPixel . element == "output" ) {
otherPixel . charged = 1 ;
}
}
}
}
2024-05-21 06:11:13 -04:00
function unchargeOutputs ( pixel ) {
2024-01-24 12:51:15 -05:00
for ( var i = 0 ; i < squareCoords . length ; i ++ ) {
var coord = squareCoords [ i ] ;
var x = pixel . x + coord [ 0 ] ;
var y = pixel . y + coord [ 1 ] ;
if ( ! isEmpty ( x , y , true ) ) {
var otherPixel = pixelMap [ x ] [ y ] ;
if ( otherPixel . element == "output" ) {
otherPixel . charged = 0 ;
}
}
}
}
elements . not _gate = {
color : "#4a1b18" ,
category : "logic" ,
state : "solid" ,
behavior : behaviors . WALL ,
tick : function ( pixel ) {
2024-05-21 06:11:13 -04:00
var countNeighborsResult = countNeighbors ( pixel )
2024-01-24 12:51:15 -05:00
if ( countNeighborsResult . charged == 0 ) {
2024-05-21 06:11:13 -04:00
chargeOutputs ( pixel ) ;
2024-01-24 12:51:15 -05:00
} else {
2024-05-21 06:11:13 -04:00
unchargeOutputs ( pixel ) ;
2024-01-24 12:51:15 -05:00
}
}
}
elements . and _gate = {
color : "#184a23" ,
category : "logic" ,
state : "solid" ,
behavior : behaviors . WALL ,
tick : function ( pixel ) {
2024-05-21 06:11:13 -04:00
var countNeighborsResult = countNeighbors ( pixel )
2024-01-24 12:51:15 -05:00
if ( countNeighborsResult . uncharged == 0 ) {
2024-05-21 06:11:13 -04:00
chargeOutputs ( pixel ) ;
2024-01-24 12:51:15 -05:00
} else {
2024-05-21 06:11:13 -04:00
unchargeOutputs ( pixel ) ;
2024-01-24 12:51:15 -05:00
}
}
}
elements . xor _gate = {
color : "#30184a" ,
category : "logic" ,
state : "solid" ,
behavior : behaviors . WALL ,
tick : function ( pixel ) {
2024-05-21 06:11:13 -04:00
var countNeighborsResult = countNeighbors ( pixel )
2025-09-06 09:48:46 -04:00
if ( countNeighborsResult . charged % 2 == 1 ) {
2024-05-21 06:11:13 -04:00
chargeOutputs ( pixel ) ;
2024-01-24 12:51:15 -05:00
} else {
2024-05-21 06:11:13 -04:00
unchargeOutputs ( pixel ) ;
2024-01-24 12:51:15 -05:00
}
}
}
elements . or _gate = {
color : "#4a4018" ,
category : "logic" ,
state : "solid" ,
behavior : behaviors . WALL ,
tick : function ( pixel ) {
2024-05-21 06:11:13 -04:00
var countNeighborsResult = countNeighbors ( pixel )
2024-01-24 12:51:15 -05:00
if ( countNeighborsResult . charged >= 1 ) {
2024-05-21 06:11:13 -04:00
chargeOutputs ( pixel ) ;
2024-01-24 12:51:15 -05:00
} else {
2024-05-21 06:11:13 -04:00
unchargeOutputs ( pixel ) ;
2024-01-24 12:51:15 -05:00
}
}
}
2024-01-24 21:08:23 -05:00
elements . nand _gate = {
color : "#eb4034" ,
category : "logic" ,
state : "solid" ,
behavior : behaviors . WALL ,
tick : function ( pixel ) {
2024-05-21 06:11:13 -04:00
var countNeighborsResult = countNeighbors ( pixel )
2024-01-24 21:08:23 -05:00
if ( countNeighborsResult . uncharged ) {
2024-05-21 06:11:13 -04:00
chargeOutputs ( pixel ) ;
2024-01-24 21:08:23 -05:00
} else {
2024-05-21 06:11:13 -04:00
unchargeOutputs ( pixel ) ;
2024-01-24 21:08:23 -05:00
}
}
}
elements . nor _gate = {
color : "#eb8c34" ,
category : "logic" ,
state : "solid" ,
behavior : behaviors . WALL ,
tick : function ( pixel ) {
2024-05-21 06:11:13 -04:00
var countNeighborsResult = countNeighbors ( pixel )
2024-01-24 21:08:23 -05:00
if ( ! countNeighborsResult . charged ) {
2024-05-21 06:11:13 -04:00
chargeOutputs ( pixel ) ;
2024-01-24 21:08:23 -05:00
} else {
2024-05-21 06:11:13 -04:00
unchargeOutputs ( pixel ) ;
2024-01-24 21:08:23 -05:00
}
}
}
elements . nxor _gate = {
color : "#ebd834" ,
category : "logic" ,
state : "solid" ,
behavior : behaviors . WALL ,
tick : function ( pixel ) {
2024-05-21 06:11:13 -04:00
var countNeighborsResult = countNeighbors ( pixel )
2025-09-06 09:48:46 -04:00
if ( ! ( countNeighborsResult . charged % 2 == 1 ) ) {
2024-05-21 06:11:13 -04:00
chargeOutputs ( pixel ) ;
2024-01-24 21:08:23 -05:00
} else {
2024-05-21 06:11:13 -04:00
unchargeOutputs ( pixel ) ;
2024-01-24 21:08:23 -05:00
}
}
}
2024-01-24 12:51:15 -05:00
elements . E2L _lever = {
color : "#b2ba75" ,
behavior : behaviors . WALL ,
state : "solid" ,
category : "logic" ,
tick : function ( pixel ) {
if ( pixel . start === pixelTicks ) {
pixel . cooldown = 0 ;
pixel . toggleMode = 1 ;
}
for ( var i = 0 ; i < adjacentCoords . length ; i ++ ) {
var coord = adjacentCoords [ i ] ;
var x = pixel . x + coord [ 0 ] ;
var y = pixel . y + coord [ 1 ] ;
if ( ! isEmpty ( x , y , true ) ) {
if ( ( pixelMap [ x ] [ y ] . charge || pixelMap [ x ] [ y ] . chargeCD ) && pixel . cooldown == 0 ) {
for ( var i = 0 ; i < adjacentCoords . length ; i ++ ) {
var coord = adjacentCoords [ i ] ;
var x = pixel . x + coord [ 0 ] ;
var y = pixel . y + coord [ 1 ] ;
if ( ! isEmpty ( x , y , true ) ) {
if ( pixelMap [ x ] [ y ] . element == "logic_wire" ) {
if ( pixel . toggleMode == 1 ) {
pixelMap [ x ] [ y ] . lstate = 2
} else {
pixelMap [ x ] [ y ] . lstate = - 2
}
}
}
}
pixel . cooldown = 15
if ( pixel . toggleMode ) {
pixel . toggleMode = 0 ;
} else {
pixel . toggleMode = 1 ;
}
}
}
}
if ( pixel . cooldown ) {
pixel . cooldown = pixel . cooldown - 1
}
}
}
elements . E2L _button = {
color : "#b2ba75" ,
behavior : behaviors . WALL ,
state : "solid" ,
category : "logic" ,
tick : function ( pixel ) {
2025-09-28 14:25:38 -04:00
if ( typeof pixel . db == "undefined" ) { pixel . db = 0 }
2024-01-24 12:51:15 -05:00
for ( var i = 0 ; i < adjacentCoords . length ; i ++ ) {
var coord = adjacentCoords [ i ] ;
var x = pixel . x + coord [ 0 ] ;
var y = pixel . y + coord [ 1 ] ;
2025-09-28 14:25:38 -04:00
if ( ! isEmpty ( x , y , true ) ) {
let newPixel = pixelMap [ x ] [ y ]
if ( newPixel . charge || newPixel . chargeCD ) {
pixel . db = 5
2024-01-24 12:51:15 -05:00
}
}
}
2025-09-28 14:25:38 -04:00
pixel . db --
2024-08-24 16:03:27 -04:00
for ( var i = 0 ; i < adjacentCoords . length ; i ++ ) {
var coord = adjacentCoords [ i ] ;
var x = pixel . x + coord [ 0 ] ;
var y = pixel . y + coord [ 1 ] ;
2025-09-28 14:25:38 -04:00
if ( ! isEmpty ( x , y , true ) ) {
if ( pixelMap [ x ] [ y ] . element == "logic_wire" ) {
if ( pixel . db > 0 ) {
pixelMap [ x ] [ y ] . lstate = 2
} else {
pixelMap [ x ] [ y ] . lstate = - 2
}
2024-08-24 16:03:27 -04:00
}
}
2024-01-24 12:51:15 -05:00
}
}
2024-01-24 13:32:08 -05:00
}
elements . L2E _constant = {
color : "#b2ba75" ,
behavior : behaviors . WALL ,
state : "solid" ,
category : "logic" ,
tick : function ( pixel ) {
var foundOn = false ;
for ( var i = 0 ; i < adjacentCoords . length ; i ++ ) {
var coord = adjacentCoords [ i ] ;
var x = pixel . x + coord [ 0 ] ;
var y = pixel . y + coord [ 1 ] ;
if ( ! isEmpty ( x , y , true ) ) {
2024-01-24 14:33:56 -05:00
if ( pixelMap [ x ] [ y ] . element == "logic_wire" && pixelMap [ x ] [ y ] . lstate > 0 ) {
2024-01-24 13:32:08 -05:00
foundOn = true ;
}
}
}
if ( foundOn ) {
for ( var i = 0 ; i < adjacentCoords . length ; i ++ ) {
var coord = adjacentCoords [ i ] ;
var x = pixel . x + coord [ 0 ] ;
var y = pixel . y + coord [ 1 ] ;
if ( ! isEmpty ( x , y , true ) ) {
if ( elements [ pixelMap [ x ] [ y ] . element ] . conduct ) {
pixelMap [ x ] [ y ] . charge = 1
}
}
}
} else {
for ( var i = 0 ; i < adjacentCoords . length ; i ++ ) {
var coord = adjacentCoords [ i ] ;
var x = pixel . x + coord [ 0 ] ;
var y = pixel . y + coord [ 1 ] ;
if ( ! isEmpty ( x , y , true ) ) {
if ( elements [ pixelMap [ x ] [ y ] . element ] . conduct ) {
pixelMap [ x ] [ y ] . charge = 0
}
}
}
}
}
2024-01-24 14:22:47 -05:00
}
var transmitterVar = 0 ;
elements . logic _transmitter = {
onSelect : function ( ) {
2024-07-02 11:49:59 -04:00
var answertransmitter = prompt ( "Please input the desired channel of this transmitter. Placing multiple ones with the same channel while paused may break." , ( transmitterVar || undefined ) ) ;
2024-01-24 14:22:47 -05:00
if ( ! answertransmitter ) { return }
transmitterVar = answertransmitter ;
} ,
color : "#c26994" ,
state : "solid" ,
behavior : behaviors . WALL ,
category : "logic" ,
tick : function ( pixel ) {
2024-05-21 06:11:13 -04:00
var neighborResult = countNeighbors ( pixel ) ;
2024-01-24 14:22:47 -05:00
if ( pixel . start === pixelTicks ) {
pixel . channel = transmitterVar ;
}
2024-01-25 20:56:22 -05:00
pixel . clone = pixel . channel ;
2024-01-24 14:22:47 -05:00
var receivers = currentPixels . filter ( function ( pixelToCheck ) {
return (
pixelToCheck !== pixel && //should work if this pixel is the same as the other one by reference
pixelToCheck . element == "logic_receiver" &&
pixelToCheck . channel == pixel . channel
) ;
} ) . map ( pixel => [ pixel . x , pixel . y ] ) ;
for ( var i in receivers ) {
i = parseInt ( i ) ;
var wifiCoords = receivers [ i ] ;
var newPixel = pixelMap [ wifiCoords [ 0 ] ] ? . [ wifiCoords [ 1 ] ] ;
if ( newPixel ) {
if ( neighborResult . charged ) {
for ( var j in adjacentCoords ) {
j = parseInt ( j ) ;
var pixelAdjacentToWifi = pixelMap [ newPixel . x + adjacentCoords [ j ] [ 0 ] ] ? . [ newPixel . y + adjacentCoords [ j ] [ 1 ] ] ;
if ( pixelAdjacentToWifi && pixelAdjacentToWifi . element == "logic_wire" ) { pixelAdjacentToWifi . lstate = 2 } ;
} ;
} else {
for ( var j in adjacentCoords ) {
j = parseInt ( j ) ;
var pixelAdjacentToWifi = pixelMap [ newPixel . x + adjacentCoords [ j ] [ 0 ] ] ? . [ newPixel . y + adjacentCoords [ j ] [ 1 ] ] ;
if ( pixelAdjacentToWifi && pixelAdjacentToWifi . element == "logic_wire" ) { pixelAdjacentToWifi . lstate = - 2 } ;
} ;
}
}
} ;
}
}
elements . logic _receiver = {
onSelect : function ( ) {
2024-07-02 11:49:59 -04:00
var answertransmitter = prompt ( "Please input the desired channel of this receiver. It will break if you do multiple different channels while paused." , ( transmitterVar || undefined ) ) ;
2024-01-24 14:22:47 -05:00
if ( ! answertransmitter ) { return }
transmitterVar = answertransmitter ;
} ,
color : "#69c2ba" ,
behavior : behaviors . WALL ,
state : "solid" ,
category : "logic" ,
tick : function ( pixel ) {
if ( pixel . start === pixelTicks ) { pixel . channel = transmitterVar }
2024-01-25 20:56:22 -05:00
pixel . clone = pixel . channel ;
2024-01-24 14:22:47 -05:00
}
2024-01-25 20:56:22 -05:00
}
elements . logic _shock = {
color : elements . shock . color ,
category : "tools" ,
tool : function ( pixel ) {
2025-09-06 09:48:46 -04:00
if ( pixel . element == "logic_wire" ) { pixel . lstate = 2 ; }
2024-01-25 20:56:22 -05:00
} ,
excludeRandom : true ,
}
elements . logic _unshock = {
color : elements . uncharge . color ,
category : "tools" ,
tool : function ( pixel ) {
2025-09-06 09:48:46 -04:00
if ( pixel . element == "logic_wire" ) { pixel . lstate = - 2 ; }
2024-01-25 20:56:22 -05:00
} ,
excludeRandom : true ,
2024-07-12 18:48:32 -04:00
}
elements . list _all _wifi = {
color : elements . lookup . color ,
category : "tools" ,
tool : function ( ) { } ,
excludeRandom : true ,
onSelect : function ( ) {
let results = { }
for ( let i in currentPixels ) {
var otherPixel = currentPixels [ i ]
if ( [ "logic_receiver" , "logic_transmitter" ] . includes ( otherPixel . element ) ) {
if ( otherPixel . channel ) {
if ( results [ otherPixel . channel ] ) {
results [ otherPixel . channel ] . push ( [ otherPixel . x , otherPixel . y ] )
} else {
results [ otherPixel . channel ] = [ [ otherPixel . x , otherPixel . y ] ]
}
}
}
}
console . log ( results )
let keys = Object . keys ( results )
let ans1 = prompt ( keys . length + " unique channels have been found. Type 1 to list them all." , 1 )
if ( ans1 == "1" ) {
ans2 = prompt ( "[" + keys + "]" + " These are all the channels found. Type the name of one of them to see the positions of all pixels with that channel." , keys [ 0 ] )
if ( keys . includes ( ans2 ) ) {
let finalString = ""
for ( i in results [ ans2 ] ) {
finalString += ", ["
finalString += results [ ans2 ] [ i ]
finalString += "]"
}
alert ( finalString )
}
}
}
2024-01-24 12:51:15 -05:00
}