239 lines
6.5 KiB
JavaScript
239 lines
6.5 KiB
JavaScript
|
|
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
|
||
|
|
};
|
||
|
|
},
|
||
|
|
}
|