playerKills = 0; aplReceivedKey = null; isShift = false; isAlt = false; document.addEventListener("keydown", function(modifierDownListener) { // User presses shift if (modifierDownListener.keyCode == 16) { isShift = true; } // User presses alt if (modifierDownListener.keyCode == 18) { isAlt = true; } }); document.addEventListener("keyup", function(modifierUpListener) { // User releases shift if (modifierUpListener.keyCode == 16) { isShift = false; } // User releases alt if (modifierUpListener.keyCode == 18) { isAlt = false; } }); entities = ["apioform_bee", "apioform", "apiodiagoform", "apiokinetoform", "apiopyroform", "cryoapioform", "apiopariform"] function apioTryMove(pixel,nx,ny,leaveBehind=undefined) { if(!isEmpty(nx,ny,true) && !outOfBounds(nx.ny)) { otherPixel = pixelMap[nx][ny]; var thisElement = pixel.element; var otherElement = otherPixel.element; if(thisElement == "apioform_player") { if(entities.includes(otherElement)) { deletePixel(nx,ny); playerKills++; movePixel(pixel,nx,ny,leaveBehind) }; } else if(entities.includes(thisElement)) { if(otherElement == "apioform_player") { deletePixel(nx,ny); movePixel(pixel,nx,ny,leaveBehind) }; }; } else { tryMove(pixel,nx,ny,leaveBehind); }; } document.addEventListener("keyup", function(apioformPlayerListener) { switch (apioformPlayerListener.keyCode) { case 38: //arrow up, letter 87: aplReceivedKey = "W"; break; case 37: //arrow left, letter 65 aplReceivedKey = "A"; break; case 40: //arrow down, letter 83 aplReceivedKey = "S"; break; case 39: //arrow right, letter 68 aplReceivedKey = "D"; break; case 27: //escape key, letter 81 aplReceivedKey = "Q"; break; }; }); elements.apioform_player = { color: "#7F7F7F", behavior: behaviors.WALL, state: "solid", density: 2000, maxSize: 1, hardness: 0.8, burnTime: 10, burn: 50, tick: function(pixel) { var xx = pixel.x; var yy = pixel.y; if(isShift) { pixel.color = "rgb(255,127,127)"; } else { pixel.color = "rgb(255,255,255)"; } if(aplReceivedKey !== null) { switch (aplReceivedKey) { case "W": apioTryMove(pixel,xx,yy-1); if(!isShift) { aplReceivedKey = null; } break; case "A": apioTryMove(pixel,xx-1,yy); if(!isShift) { aplReceivedKey = null; } break; case "S": apioTryMove(pixel,xx,yy+1); if(!isShift) { aplReceivedKey = null; } break; case "D": apioTryMove(pixel,xx+1,yy); if(!isShift) { aplReceivedKey = null; } break; case "Q": //Use if a key gets stuck aplReceivedKey = null; isShift = null; break; }; }; }, } elements.apioform_bee = { color: ["#808020", "#A0A050"], properties: { stage: ((Math.random() < 0.5) ? 0 : 1), }, behavior: behaviors.WALL, state: "solid", density: 2000, maxSize: 1, hardness: 0.8, flippableY: true, tick: function(pixel) { if(isNaN(pixel.stage)) { pixel.stage = ((Math.random() < 0.5) ? 0 : 1); }; pixel.stage = Math.min(1,Math.max(0,Math.round(pixel.stage))); //stage validation var moveCoords = (pixel.flipY ? [pixel.x, pixel.y+1] : [pixel.x, pixel.y-1]); //direction is randomized by flippableY if(pixel.stage === 0) { //color pixel.color = "rgb(128,128,32)"; } else if(pixel.stage === 1) { pixel.color = "rgb(160,160,80)"; }; if(pixelTicks - pixel.start > 0) { //don't move on first tick, to allow color to normalize if(pixel.stage === 0) { //if in still stage pixel.stage = 1; //change to moving stage } else if(pixel.stage === 1) { //else if in moving stage apioTryMove(pixel,moveCoords[0],moveCoords[1]); //move pixel.flipY = !pixel.flipY; //flip that pixel.stage = 0; //change to still stage }; }; }, } elements.apioform = { color: "#A08020", behavior: behaviors.WALL, state: "solid", density: 2000, maxSize: 1, hardness: 0.8, rotatable: true, tick: function(pixel) { if(isNaN(pixel.r)) { pixel.r = Math.floor(Math.random() * 4); }; pixel.r = Math.round(pixel.r) % 4; //rotation validation, probably redundant since rotation is from the base game var moveCoords; switch (pixel.r) { case 0: moveCoords = [pixel.x+1, pixel.y+0]; break; case 1: moveCoords = [pixel.x+0, pixel.y-1]; break; case 2: moveCoords = [pixel.x-1, pixel.y+0]; break; case 3: moveCoords = [pixel.x+0, pixel.y+1]; break; }; //rotation is randomized by rotatable if(pixelTicks - pixel.start > 0) { //maintained for consistency apioTryMove(pixel,moveCoords[0],moveCoords[1]); //move pixel.r++; //increment rotation }; }, } elements.apiodiagoform = { color: "#A080A0", behavior: behaviors.WALL, state: "solid", density: 2000, maxSize: 1, hardness: 0.8, rotatable: true, tick: function(pixel) { if(isNaN(pixel.r)) { pixel.r = Math.floor(Math.random() * 4); }; pixel.r = Math.round(pixel.r) % 4; //rotation validation, probably redundant since rotation is from the base game var moveCoords; switch (pixel.r) { case 0: moveCoords = [pixel.x-1, pixel.y-1]; break; case 1: moveCoords = [pixel.x-1, pixel.y+1]; break; case 2: moveCoords = [pixel.x+1, pixel.y+1]; break; case 3: moveCoords = [pixel.x+1, pixel.y-1]; break; }; //rotation is randomized by rotatable if(pixelTicks - pixel.start > 0) { //maintained for consistency apioTryMove(pixel,moveCoords[0],moveCoords[1]); //move pixel.r++; //increment rotation }; }, }