function pixelTickMod1(pixel) { if (pixel.start === pixelTicks) {return} var info = elements[pixel.element]; if (pixel.charge && info.behaviorOn) { var behavior = info.behaviorOn; } else { var behavior = info.behavior; } if (pixel.flipX) { behavior = flipBehavior(behavior,"x"); } if (pixel.flipY) { behavior = flipBehavior(behavior,"y"); } if (pixel.r) { behavior = rotateBehavior(behavior,pixel.r); } var x = pixel.x; var y = pixel.y; var move1Spots = []; var move2Spots = []; var move3Spots = []; var move4Spots = []; var move5Spots = []; var move6Spots = []; var move7Spots = []; var move8Spots = []; var supportSpots = []; var swapSpots = []; var leaveBehind = null; var leaveBehind1 = null; var leaveBehind2 = null; var leaveBehind3 = null; var leaveBehind4 = null; var leaveBehind5 = null; var leaveBehind6 = null; var leaveBehind7 = null; var leaveBehind8 = null; var move = true; // Parse behavior for (var by = 0; by < behavior.length; by++) { var behaviorby = behavior[by]; for (var bx = 0; bx < behaviorby.length; bx++) { var b0 = behaviorby[bx]; if (b0 === "XX") {continue} //if (b.includes(" OR ")) { // b = b.split(" OR ")[Math.floor(Math.random()*b.split(" OR ").length)]; //} // Loop through b0.split(" AND ") if (b0.includes(" AND ")) { var andsplit = b0.split(" AND "); } else { var andsplit = [b0]; } for (var i = 0; i < andsplit.length; i++) { var b = andsplit[i]; if (b.includes(":")) { var arg = b.split(":")[1].split(/[\:\%]/)[0]; if (!b.includes("%")) { b = b.split(/[\:\%]/)[0]; } } else { var arg = null;} // If b has "%" followed by a number in it, it's a chance to move if (b.includes("%")) { // Split the string at the "%" and use the second half as the chance (float) var chance = parseFloat(b.split("%")[1]); //console.log(b+": "+(Math.random()*100 < chance)); b = b.split(/[\:\%]/)[0]; } else { var chance = 100; } if (chance==100 || Math.random()*100 < chance) { var newCoords = behaviorCoords(x,y,bx,by); if (b == "M1") { if (info.viscosity != undefined) { if (!((Math.random()*100) < 100 / ((info.viscosity) ** 0.25))) { newCoords.x = x; } } move1Spots.push(newCoords); } else if (b == "M2") { if (info.viscosity != undefined) { if (!((Math.random()*100) < 100 / ((info.viscosity) ** 0.25))) { newCoords.x = x; } } move2Spots.push(newCoords); } else if (b == "M3") { if (info.viscosity != undefined) { if (!((Math.random()*100) < 100 / ((info.viscosity) ** 0.25))) { newCoords.x = x; } } move3Spots.push(newCoords); } else if (b == "M4") { if (info.viscosity != undefined) { if (!((Math.random()*100) < 100 / ((info.viscosity) ** 0.25))) { newCoords.x = x; } } move4Spots.push(newCoords); } else if (b == "M5") { if (info.viscosity != undefined) { if (!((Math.random()*100) < 100 / ((info.viscosity) ** 0.25))) { newCoords.x = x; } } move5Spots.push(newCoords); } else if (b == "M6") { if (info.viscosity != undefined) { if (!((Math.random()*100) < 100 / ((info.viscosity) ** 0.25))) { newCoords.x = x; } } move6Spots.push(newCoords); } else if (b == "M7") { if (info.viscosity != undefined) { if (!((Math.random()*100) < 100 / ((info.viscosity) ** 0.25))) { newCoords.x = x; } } move7Spots.push(newCoords); } else if (b == "M8") { if (info.viscosity != undefined) { if (!((Math.random()*100) < 100 / ((info.viscosity) ** 0.25))) { newCoords.x = x; } } move8Spots.push(newCoords); } else if (b == "SP") { supportSpots.push({x:newCoords.x,y:newCoords.y,arg:arg}); } else if (b == "SA") { if (!isEmpty(newCoords.x,newCoords.y,true)) { move = false; } } else if (b == "DL") { if (!isEmpty(newCoords.x,newCoords.y,true)) { // if the pixel at newCoords is the same element as the pixel, ignore newPixel = pixelMap[newCoords.x][newCoords.y]; // if info.ignore exists and newPixel.element is in it if (info.ignore && info.ignore.includes(newPixel.element)) { continue; } if ((!(newPixel.element == pixel.element)) || (newCoords.x == x && newCoords.y == y)) { if (arg != null) { var args = arg.split(","); } if (arg == null || args.includes(newPixel.element)) { if (!elements[newPixel.element].hardness || Math.random() > elements[newPixel.element].hardness) { deletePixel(newCoords.x,newCoords.y); if (newCoords.x == x && newCoords.y == y) { var deleted = true; } swapSpots = []; } } } } } else if (b == "DB") { // Delete Both if (!isEmpty(newCoords.x,newCoords.y,true)) { // if the pixel at newCoords is the same element as the pixel, ignore newPixel = pixelMap[newCoords.x][newCoords.y]; // if info.ignore exists and newPixel.element is in it if (info.ignore && info.ignore.includes(newPixel.element)) { continue; } if (!(newPixel.element == pixel.element)) { if (arg != null) { var args = arg.split(","); } if (arg == null || args.includes(newPixel.element)) { if (!elements[newPixel.element].hardness || Math.random() > elements[newPixel.element].hardness) { deletePixel(newCoords.x,newCoords.y); if (pixelMap[pixel.x][pixel.y] != undefined) { deletePixel(pixel.x,pixel.y); } var deleted = true; swapSpots = []; } } } } } //Change pixel else if (b == "CH") { if (!isEmpty(newCoords.x,newCoords.y,true)) { var newPixel = pixelMap[newCoords.x][newCoords.y]; if (!elements[newPixel.element].hardness || Math.random() > elements[newPixel.element].hardness) { if (arg.includes(">")) { var argfrom = arg.split(">")[0]; var argto = arg.split(">")[1]; } else { var argfrom = null; var argto = arg; } if (argto.includes(",")) { var argto = argto.split(",")[Math.floor(Math.random()*argto.split(",").length)]; } if (elements[argto]) { if ((newPixel.element != argto) && (argfrom == null || argfrom == newPixel.element)) { newPixel.element = argto; newPixel.color = pixelColorPick(newPixel); newPixel.start = pixelTicks; if (elements[argto].burning != true) { newPixel.burning = false; } else { newPixel.burning = true; newPixel.burnStart = pixelTicks; } if (newPixel.r && !elements[argto].rotatable) { newPixel.r = false; } if (newPixel.flipX && !elements[argto].flippableX) { newPixel.flipX = false; } if (newPixel.flipY && !elements[argto].flippableY) { newPixel.flipY = false; } } } } } } //Swap else if (b == "SW") { if (!isEmpty(newCoords.x,newCoords.y,true)) { var newPixel = pixelMap[newCoords.x][newCoords.y]; if (arg != null) { var args = arg.split(","); } if (arg == null || args.includes(newPixel.element)) { if (!elements[newPixel.element].hardness || Math.random() > elements[newPixel.element].hardness) { swapSpots.push({x:newCoords.x,y:newCoords.y}); } } } } //Create pixel else if (b == "CR") { if (isEmpty(newCoords.x,newCoords.y)) { if (arg == null) { arg = pixel.element; } else if (arg.includes(",")) { arg = arg.split(",")[Math.floor(Math.random()*arg.split(",").length)]; } if (elements[arg]) { createPixel(arg,newCoords.x,newCoords.y); pixelMap[newCoords.x][newCoords.y].temp = pixel.temp } } } // Clone self else if (b == "CL") { if (isEmpty(newCoords.x,newCoords.y)) { if (arg == null || pixel.temp >= parseFloat(arg)) { clonePixel(pixel,newCoords.x,newCoords.y); } } } // Clone first touched else if (b == "CF") { if (pixel.clone) { if (isEmpty(newCoords.x,newCoords.y)) { createPixel(pixel.clone,newCoords.x,newCoords.y); pixelMap[newCoords.x][newCoords.y].temp = pixel.temp; } } else { if (!isEmpty(newCoords.x,newCoords.y,true)) { newPixel = pixelMap[newCoords.x][newCoords.y]; if (newPixel.element != pixel.element && newPixel.element != "wire") { pixel.clone = newPixel.element; pixel.temp = newPixel.temp; } else if (newPixel.clone) { pixel.clone = newPixel.clone; pixel.temp = newPixel.temp; } } } } else if (b=="SH") { if (!isEmpty(newCoords.x,newCoords.y,true)) { var newPixel = pixelMap[newCoords.x][newCoords.y]; var con = elements[newPixel.element].conduct; if (con != undefined) { if (Math.random() < con) { // If random number is less than conductivity if (!newPixel.charge && !newPixel.chargeCD) { newPixel.charge = (parseFloat(arg) || 1); if (elements[newPixel.element].colorOn) { newPixel.color = pixelColorPick(newPixel); } } } } } } //Stick else if (b=="ST") { if (!isEmpty(newCoords.x,newCoords.y,true)) { var newPixel = pixelMap[newCoords.x][newCoords.y]; if (newPixel.element != pixel.element && (arg == null || newPixel.element == arg)) { var sticking = true } } } //Leave behind element else if (b == "LB" || b == "L1" || b == "L2" || b == "L3" || b == "L4" || b == "L5" || b == "L6" || b == "L7" || b == "L8") { if (arg != null && arg.includes(",")) { arg = arg.split(",")[Math.floor(Math.random()*arg.split(",").length)]; } if (elements[arg]) { if (b=="LB") {leaveBehind = arg;} else if (b=="L1") {leaveBehind1 = arg;} else if (b=="L2") {leaveBehind2 = arg;} else if (b=="L3") {leaveBehind3 = arg;} else if (b=="L4") {leaveBehind4 = arg;} else if (b=="L5") {leaveBehind5 = arg;} else if (b=="L6") {leaveBehind6 = arg;} else if (b=="L7") {leaveBehind7 = arg;} else if (b=="L8") {leaveBehind8 = arg;} } } //Change color else if (b == "CC") { if (!isEmpty(newCoords.x,newCoords.y,true)) { var newPixel = pixelMap[newCoords.x][newCoords.y]; if (arg == null) {arg = newPixel.colorObject} else { if (arg.includes(",")) { arg = arg.split(",")[Math.floor(Math.random()*arg.split(",").length)]; } if (!arg.startsWith("#")) { arg = "#" + arg; } } newPixel.color = pixelColorPick(newPixel,arg); } } //Heat else if (b == "HT") { if (!isEmpty(newCoords.x,newCoords.y,true)) { var newPixel = pixelMap[newCoords.x][newCoords.y]; // if the element isn't the same or the coords ARE the same if (!(newPixel.element == pixel.element) || (newCoords.x == pixel.x && newCoords.y == pixel.y)) { if (arg != null) {arg = parseFloat(arg)} else {arg = 1} if (isNaN(arg)) {arg = 1} newPixel.temp += arg; pixelTempCheck(newPixel); } } } //Cool else if (b == "CO") { if (!isEmpty(newCoords.x,newCoords.y,true)) { var newPixel = pixelMap[newCoords.x][newCoords.y]; if (!(newPixel.element == pixel.element) || (newCoords.x == pixel.x && newCoords.y == pixel.y)) { if (arg != null) {arg = parseFloat(arg)} else {arg = 1} if (isNaN(arg)) {arg = 1} newPixel.temp -= arg; pixelTempCheck(newPixel); } } } // Flip X else if (b == "FX") { if (!isEmpty(newCoords.x,newCoords.y,true)) { var newPixel = pixelMap[newCoords.x][newCoords.y]; if (elements[newPixel.element].flippableX) { if (arg === "0") { newPixel.flipX = false; } else if (arg === "1") { newPixel.flipX = true; } newPixel.flipX = !newPixel.flipX; } } } // Flip Y else if (b == "FY") { if (!isEmpty(newCoords.x,newCoords.y,true)) { var newPixel = pixelMap[newCoords.x][newCoords.y]; if (elements[newPixel.element].flippableY) { if (arg === "0") { newPixel.flipY = false; } else if (arg === "1") { newPixel.flipY = true; } else { newPixel.flipY = !newPixel.flipY; } } } } // Rotate else if (b == "RT") { if (!isEmpty(newCoords.x,newCoords.y,true)) { var newPixel = pixelMap[newCoords.x][newCoords.y]; // If arg isn't null, set arg to a random choice from arg.split(",") if (arg != null && arg.includes(",")) { arg = arg.split(",")[Math.floor(Math.random()*arg.split(",").length)]; } if (elements[newPixel.element].rotatable) { newPixel.r = ((newPixel.r||0) + (parseInt(arg)||1)) % 4; } } } // Bounce else if (b == "BO") { if (!isEmpty(newCoords.x,newCoords.y)) { if (info.flippableX) { pixel.flipX = !pixel.flipX; } if (info.flippableY) { pixel.flipY = !pixel.flipY; } if (info.rotatable) { // If arg isn't null, set arg to a random choice from arg.split(",") if (arg != null && arg.includes(",")) { arg = arg.split(",")[Math.floor(Math.random()*arg.split(",").length)]; } if (pixel.r !== undefined) { pixel.r = (pixel.r + (parseInt(arg)||2)) % 4; } else { pixel.r = (parseInt(arg)||2); } } } } // Change When M2 else if (b == "C2") { if (arg.includes(",")) { arg = arg.split(",")[Math.floor(Math.random()*arg.split(",").length)]; } var C2 = arg; } // Change When M3 else if (b == "C3") { if (arg.includes(",")) { arg = arg.split(",")[Math.floor(Math.random()*arg.split(",").length)]; } var C3 = arg; } // Change When M4 else if (b == "C4") { if (arg.includes(",")) { arg = arg.split(",")[Math.floor(Math.random()*arg.split(",").length)]; } var C4 = arg; } // Change When M5 else if (b == "C5") { if (arg.includes(",")) { arg = arg.split(",")[Math.floor(Math.random()*arg.split(",").length)]; } var C5 = arg; } // Change When M6 else if (b == "C6") { if (arg.includes(",")) { arg = arg.split(",")[Math.floor(Math.random()*arg.split(",").length)]; } var C6 = arg; } // Change When M7 else if (b == "C7") { if (arg.includes(",")) { arg = arg.split(",")[Math.floor(Math.random()*arg.split(",").length)]; } var C7 = arg; } // Change When M8 else if (b == "C8") { if (arg.includes(",")) { arg = arg.split(",")[Math.floor(Math.random()*arg.split(",").length)]; } var C8 = arg; } // Explode else if (b == "EX") { if (!isEmpty(newCoords.x,newCoords.y)) { if (outOfBounds(newCoords.x,newCoords.y) || (newCoords.x == x && newCoords.y == y) || (pixel.element !== pixelMap[newCoords.x][newCoords.y].element && elements[pixelMap[newCoords.x][newCoords.y].element].state !== "gas")) { // if arg contains ">", var fire = everything after it, arg = everything before it if (arg.includes(">")) { var fire = arg.split(">")[1]; arg = arg.split(">")[0]; } else { var fire = "fire" } // arg = a number if (arg != null) { arg = parseInt(arg); if (isNaN(arg)) {arg = 3} } else {arg = 3} explodeAt(x,y,arg,fire); if (!pixel.del && info.hardness !== 1) { deletePixel(x,y); var deleted = true; } swapSpots = []; } } } } } } } if (typeof deleted !== "undefined") {return;} if (supportSpots.length > 0) { var supportCount = 0; var allEmpty = true; for (var i = 0; i < supportSpots.length; i++) { var bx = supportSpots[i].x; var by = supportSpots[i].y; var arg = supportSpots[i].arg; if (!isEmpty(bx,by,true)) { if ((arg == null && !validDensitySwaps.includes(info.state+">"+elements[pixelMap[bx][by].element].state)) || pixelMap[bx][by].element == arg) { supportCount++; } } } if (supportCount == supportSpots.length) { move = false; } } var moved = false; if (swapSpots.length > 0) { var coords = swapSpots[Math.floor(Math.random()*swapSpots.length)]; if (pixelMap[coords.x][coords.y] != undefined) { swapPixels(pixel,pixelMap[coords.x][coords.y]); move = false; moved = true; } } if (typeof sticking !== "undefined") { move = false; } // Move First Priority if (move) { if (move1Spots.length > 0) { // While move1Spots is not empty while (move1Spots.length > 0) { // coords = random item of move1Spots var coords = move1Spots[Math.floor(Math.random()*move1Spots.length)]; var nx = coords.x; var ny = coords.y; moved = tryMove(pixel,nx,ny,leaveBehind1 || leaveBehind); if (moved) { break; } else { // remove coords from move1Spots move1Spots.splice(move1Spots.indexOf(coords),1); } } } // Move Second Priority if (!moved && move2Spots.length > 0) { // While move2Spots is not empty while (move2Spots.length > 0) { // coords = random item of move2Spots var coords = move2Spots[Math.floor(Math.random()*move2Spots.length)]; var nx = coords.x; var ny = coords.y; moved = tryMove(pixel,nx,ny,leaveBehind2 || leaveBehind); if (moved) { if (typeof C2 !== "undefined" && elements[C2]) { pixel.element = C2; pixel.color = pixelColorPick(pixel); pixel.start = pixelTicks; if (elements[C2].burning != true) { pixel.burning = false; } else { pixel.burning = true; pixel.burnStart = pixelTicks; } } break; } else { // remove coords from move2Spots move2Spots.splice(move2Spots.indexOf(coords),1); } } //Move Third Priority if (!moved && move3Spots.length > 0) { // While move3Spots is not empty while (move3Spots.length > 0) { // coords = random item of move3Spots var coords = move3Spots[Math.floor(Math.random()*move3Spots.length)]; var nx = coords.x; var ny = coords.y; moved = tryMove(pixel,nx,ny,leaveBehind3 || leaveBehind); if (moved) { if (typeof C3 !== "undefined" && elements[C3]) { pixel.element = C3; pixel.color = pixelColorPick(pixel); pixel.start = pixelTicks; if (elements[C3].burning != true) { pixel.burning = false; } else { pixel.burning = true; pixel.burnStart = pixelTicks; } } break; } else { // remove coords from move3Spots move3Spots.splice(move3Spots.indexOf(coords),1); } } //Move Fourth Priority if (!moved && move4Spots.length > 0) { // While move4Spots is not empty while (move4Spots.length > 0) { // coords = random item of move4Spots var coords = move4Spots[Math.floor(Math.random()*move4Spots.length)]; var nx = coords.x; var ny = coords.y; moved = tryMove(pixel,nx,ny,leaveBehind4 || leaveBehind); if (moved) { if (typeof C4 !== "undefined" && elements[C4]) { pixel.element = C4; pixel.color = pixelColorPick(pixel); pixel.start = pixelTicks; if (elements[C4].burning != true) { pixel.burning = false; } else { pixel.burning = true; pixel.burnStart = pixelTicks; } } break; } else { // remove coords from move4Spots move4Spots.splice(move4Spots.indexOf(coords),1); } } //Move Fifth Priority if (!moved && move5Spots.length > 0) { // While move5Spots is not empty while (move5Spots.length > 0) { // coords = random item of move5Spots var coords = move5Spots[Math.floor(Math.random()*move5Spots.length)]; var nx = coords.x; var ny = coords.y; moved = tryMove(pixel,nx,ny,leaveBehind5 || leaveBehind); if (moved) { if (typeof C5 !== "undefined" && elements[C5]) { pixel.element = C5; pixel.color = pixelColorPick(pixel); pixel.start = pixelTicks; if (elements[C5].burning != true) { pixel.burning = false; } else { pixel.burning = true; pixel.burnStart = pixelTicks; } } break; } else { // remove coords from move5Spots move5Spots.splice(move5Spots.indexOf(coords),1); } } //Move Sixth Priority if (!moved && move6Spots.length > 0) { // While move6Spots is not empty while (move6Spots.length > 0) { // coords = random item of move6Spots var coords = move6Spots[Math.floor(Math.random()*move6Spots.length)]; var nx = coords.x; var ny = coords.y; moved = tryMove(pixel,nx,ny,leaveBehind6 || leaveBehind); if (moved) { if (typeof C6 !== "undefined" && elements[C6]) { pixel.element = C6; pixel.color = pixelColorPick(pixel); pixel.start = pixelTicks; if (elements[C6].burning != true) { pixel.burning = false; } else { pixel.burning = true; pixel.burnStart = pixelTicks; } } break; } else { // remove coords from move6Spots move6Spots.splice(move6Spots.indexOf(coords),1); } } //Move Seventh Priority if (!moved && move7Spots.length > 0) { // While move7Spots is not empty while (move7Spots.length > 0) { // coords = random item of move7Spots var coords = move7Spots[Math.floor(Math.random()*move7Spots.length)]; var nx = coords.x; var ny = coords.y; moved = tryMove(pixel,nx,ny,leaveBehind7 || leaveBehind); if (moved) { if (typeof C7 !== "undefined" && elements[C7]) { pixel.element = C7; pixel.color = pixelColorPick(pixel); pixel.start = pixelTicks; if (elements[C7].burning != true) { pixel.burning = false; } else { pixel.burning = true; pixel.burnStart = pixelTicks; } } break; } else { // remove coords from move7Spots move7Spots.splice(move7Spots.indexOf(coords),1); } } //Move Eighth Priority if (!moved && move8Spots.length > 0) { // While move8Spots is not empty while (move8Spots.length > 0) { // coords = random item of move8Spots var coords = move8Spots[Math.floor(Math.random()*move8Spots.length)]; var nx = coords.x; var ny = coords.y; moved = tryMove(pixel,nx,ny,leaveBehind8 || leaveBehind); if (moved) { if (typeof C8 !== "undefined" && elements[C8]) { pixel.element = C8; pixel.color = pixelColorPick(pixel); pixel.start = pixelTicks; if (elements[C8].burning != true) { pixel.burning = false; } else { pixel.burning = true; pixel.burnStart = pixelTicks; } } break; } else { // remove coords from move8Spots move8Spots.splice(move8Spots.indexOf(coords),1); } } } } } } } } } } // Change tempearture if needed (unused) /*if (info.tempChange != undefined) { pixel.temp += info.tempChange; pixelTempCheck(pixel); }*/ // Burning doBurning(pixel); // Heat Transfer if (info.insulate != true) { doHeat(pixel); } // Electricity Transfer doElectricity(pixel); } elements.m3test = { "color": "#33aa44", "behavior": [ "XX|M3%10|XX", "M2|XX|M2", "M1|M1|M1" ], tick: function(pixel) { pixelTickMod1(pixel) }, "density": 1200, "state": "liquid", "category": "special" } elements.m3test2 = { "color": "#aa3344", "behavior": [ "M6|M5|M4", "M7|LB:wood|M3", "M8|M1|M2" ], tick: function(pixel) { pixelTickMod1(pixel) }, "density": 120000, "state": "solid", "category": "special" }