Untitled
unknown
plain_text
4 years ago
28 kB
8
Indexable
(function(){
var checkbox;
var buttons;
var canvas;
var ctx;
var width;
var height;
var mapSize;
var interval;
var viewDistance = 15;
var chests = {};
var version = "1";
var textBoxText = "";
var rectEasy = {};
var hasNextPage = false;
var hasPrevPage = false;
var rectNext = {};
var rectPrev = {};
var rectNormal = {};
var rectHard = {};
var page = 0;
var difficulty;
var timer = 0;
var char = {
x : 1,
y : 1,
facing : 0,
rotateTimer : 0,
stepTime : 0,
compass : false,
map : false,
pickaxe : 0,
};
var visitedTiles = [];
var map = [];
var tiles = {"w":{"colour":"#8B8589", "shadow":"#454244", "collision":"true"},"g":{"colour":"#C0C0C0", "collision":"false"}};
document.addEventListener('DOMContentLoaded', init, false);
function init(){
canvas = document.querySelector('canvas');
ctx = canvas.getContext('2d');
width = canvas.width;
height = canvas.height;
titleScreen();
buttons = document.querySelectorAll('button');
for(var i=0;i<buttons.length;i++){
buttons[i].addEventListener('click', button, false);
}
checkbox = document.querySelector('input');
checkbox.addEventListener('change', changed, false);
}
function changed(event){
if(checkbox.checked == true){
for(var i=0;i<buttons.length;i++){
buttons[i].style.visibility = "visible";
}
}
else{
for(var i=0;i<buttons.length;i++){
buttons[i].style.visibility = "hidden";
}
}
}
function titleScreen(){
var gradient = ctx.createLinearGradient(0, 0, 0, height);
gradient.addColorStop(0, "#87CEEB");
gradient.addColorStop(1, "#C0C0C0");
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, width, height);
ctx.fillStyle = "black";
rectEasy={x:40, y: 40, width: width-80, height: height/3 - 80};
ctx.fillRect(rectEasy.x, rectEasy.y, rectEasy.width, rectEasy.height);
rectNormal={x:40, y: height/3 + 40, width: width-80, height: height/3 - 80};
ctx.fillRect(rectNormal.x, rectNormal.y, rectNormal.width, rectNormal.height);
rectHard={x:40, y: 2 * height/3 + 40, width: width-80, height: height/3 - 80};
ctx.fillRect(rectHard.x, rectHard.y, rectHard.width, rectHard.height);
ctx.font="20px Georgia";
ctx.fillStyle = "white";
ctx.textAlign="center";
ctx.textBaseline="middle";
ctx.fillText("Easy", width/2, rectEasy.y+(rectEasy.height/2));
ctx.fillText("Normal", width/2, rectNormal.y+(rectNormal.height/2));
ctx.fillText("Hard", width/2, rectHard.y+(rectHard.height/2));
canvas.addEventListener("click", click, false);
}
function click(event){
var mousePos = getMousePos(canvas, event);
if (isInside(mousePos,rectEasy)) {
mapSize = 21;
difficulty = 0;
}else if(isInside(mousePos,rectNormal)) {
mapSize = 101;
difficulty = 1;
}else if(isInside(mousePos,rectHard)) {
mapSize = 501;
difficulty = 2;
}else{
return;
}
canvas.removeEventListener("click",click);
start();
}
function getMousePos(canvas, event) {
var rect = canvas.getBoundingClientRect();
var scaleX = canvas.width / rect.width;
var scaleY = canvas.height / rect.height;
return {
x: (event.clientX - rect.left) * scaleX,
y: (event.clientY - rect.top) * scaleY
}
}
function isInside(pos, rect){
return pos.x > rect.x && pos.x < rect.x+rect.width && pos.y < rect.y+rect.height && pos.y > rect.y;
}
function start(){
setup();
interval = window.setInterval(draw, 33);
document.addEventListener("keydown", keyIn, false);
}
function draw(){
ctx.fillStyle = "#87CEEB";
ctx.fillRect(0, 0, width, height/2);
ctx.fillStyle = "#C0C0C0";
ctx.fillRect(0, height/2, width, height/2);
draw3dMap();
drawCompass();
drawMap();
drawTextBox();
drawPickaxes();
}
function drawTextBox(){
if(textBoxText !== ""){
ctx.fillStyle = "black";
ctx.fillRect(0, height * (9/10), width, height / 10);
ctx.font="20px Georgia";
ctx.fillStyle = "white";
ctx.textAlign="center";
ctx.textBaseline="middle";
ctx.fillText(textBoxText, width / 2, height * (19/20), width - 50);
}
}
function drawPickaxes(){
if(char.pickaxe > 0){
ctx.beginPath();
ctx.fillStyle = "#FFFFFF";
ctx.arc(width - 105, 30, 30, 0, Math.PI * 2);
ctx.fill();
ctx.beginPath();
ctx.strokeStyle = "#964B00";
ctx.lineWidth = 3;
ctx.moveTo(width - 125, 50);
ctx.lineTo(width - (105 - 17.6776), 30 - 17.6776);
ctx.stroke();
ctx.beginPath();
ctx.strokeStyle = "black";
ctx.arc(width - 105, 30, 25, 3 * Math.PI / 2, 0);
ctx.stroke();
ctx.beginPath();
ctx.fillStyle = "red";
ctx.arc(width - 80, 50, 10, 0, Math.PI * 2);
ctx.fill();
ctx.font="20px Georgia";
ctx.fillStyle = "black";
ctx.textAlign="center";
ctx.textBaseline="middle";
ctx.fillText(char.pickaxe, width - 80, 50);
ctx.lineWidth = 1;
}
}
function drawCompass(){
if(char.compass){
ctx.fillStyle = "black";
ctx.beginPath();
ctx.arc(width - 30, 30, 25, 0, 2*Math.PI);
ctx.fill();
ctx.font="20px Georgia";
ctx.fillStyle = "red";
ctx.textAlign="center";
ctx.fillText("N", width - 30, 22);
ctx.strokeStyle = "#C0C0C0";
ctx.lineWidth=2;
ctx.beginPath();
ctx.moveTo(width - 30, 30);
var angle = (char.facing * Math.PI / 2) - (char.rotateTimer * Math.PI / 12);
ctx.lineTo((width - 30) - 22 * Math.sin(angle), 30 - 22 * Math.cos(angle));
ctx.stroke();
}
}
function drawMap(){
if(char.map){
ctx.fillStyle = "#F8ECC2";
ctx.fillRect(5, 5, 80, 80);
if(!visited(char.x, char.y)){
visitedTiles.push([char.x, char.y]);
}
for(var x = char.x - 10; x < char.x + 10; x++){
for(var y = char.y - 10; y < char.y + 10; y++){
if(seen(x,y)){
ctx.fillStyle = tiles [map[y][x]] ["colour"];
ctx.fillRect(45 + (x-char.x)*4, 45 + (y-char.y)*4, 4, 4);
}
}
}
ctx.fillStyle = "red";
ctx.fillRect(45, 45, 4, 4);
}
}
function visited(x,y){
for(var index = 0; index<visitedTiles.length; index++){
if(visitedTiles[index][0] === x && visitedTiles[index][1] === y){
return true;
}
}
return false;
}
function seen(x,y){
for(var i = -1; i < 2; i++){
for(var j = -1; j < 2; j++){
if(x < mapSize && y < mapSize && x >= 0 && y >= 0 && visited(x+i,y+j)){
return true;
}
}
}
return false;
}
function pointToCanvas(distance, xoffset, yoffset){
var x = (width/2) + 500 * (xoffset / (1+(distance / 1.5)))
var y = (height/2) - 150 * (yoffset / (1+(distance / 1.5)))
return [x, y];
}
function drawTile3d(tile, x, y, flag){
if(tiles[tile]["collision"] === "true"){
distance = 0;
offset = 0;
if(char.facing === 0){
distance = char.y - y;
offset = x - char.x;
} else if(char.facing === 1){
distance = x - char.x;
offset = y - char.y;
} else if(char.facing === 2){
distance = y - char.y;
offset = char.x - x;
} else if(char.facing === 3){
distance = char.x - x;
offset = char.y - y;
}
if(char.stepTime !== 0){
distance = distance + (char.stepTime/6);
}
draw3dCube(distance, offset, tiles[tile]["colour"], tiles[tile]["shadow"], -1 * Math.PI * char.rotateTimer/12, flag);
}
else if([x, y] in chests){
var chest = chests[[x, y]];
if(char.facing === 0){
distance = char.y - y;
offset = x - char.x;
} else if(char.facing === 1){
distance = x - char.x;
offset = y - char.y;
} else if(char.facing === 2){
distance = y - char.y;
offset = char.x - x;
} else if(char.facing === 3){
distance = char.x - x;
offset = char.y - y;
}
if(char.stepTime !== 0){
distance = distance + (char.stepTime/6);
}
drawChest(distance, offset, chest, -1 * Math.PI * char.rotateTimer/12);
}
}
function drawChest(distance, offset, chest, rotation){
var centerY = ((distance * Math.cos(rotation)) + (offset * Math.sin(rotation)));
var centerX = ((offset * Math.cos(rotation)) - (distance * Math.sin(rotation)));
if(centerY < -0.5){
return;
}
if(!chest.opened){
drawBox(centerX, centerY, -1.5, rotation, 1, 1 / (2 * Math.sqrt(2)), "#964B00", "#964B00", 0);
drawBox(centerX, centerY, -0.8, rotation, 0.4, 1 / (2 * Math.sqrt(2)), "#964B00", "#964B00", 0);
} else{
drawBox(centerX, centerY, -1.5, rotation, 1, 1 / (2 * Math.sqrt(2)), "#964B00", "#964B00", -2);
}
}
function draw3dMap(){
var f = char.facing;
var flag = 0;
if(char.rotateTimer < -2){
f++;
if(f == 4){
f = 0;
}
flag = -1;
} else if(char.rotateTimer > 2){
f--;
if(f == -1){
f = 3;
}
flag = 1;
}
var farthest = ((f%2) * char.x + ((f+1)%2) * char.y) + (-1 * Math.abs(2 * (f-1.5)) + 2) * viewDistance;
if(farthest < 0){
farthest = 0;
}
if(farthest >= mapSize){
farthest = mapSize - 1;
}
var closest = ((f%2) * char.x + ((f+1)%2) * char.y) + (Math.abs(2 * (f-1.5)) - 2) * viewDistance;
if(closest < -1){
closest = -1;
}
if(closest > mapSize){
closest = mapSize;
}
while (farthest !== closest) {
var leftest = (((f+1)%2) * char.x + (f%2) * char.y) - viewDistance;
var rightest = (((f+1)%2) * char.x + (f%2) * char.y) + viewDistance;
if(leftest < 0){
leftest = 0;
}
if(leftest >= mapSize){
leftest = mapSize-1;
}
if(rightest < 0){
rightest = 0;
}
if(rightest >= mapSize){
rightest = mapSize-1;
}
while (leftest !== (((f+1)%2) * char.x + (f%2) * char.y)){
var tile = map[((f+1)%2) * farthest + ((f)%2) * leftest][((f)%2) * farthest + ((f+1)%2) * leftest];
drawTile3d(tile, ((f)%2) * farthest + ((f+1)%2) * leftest, ((f+1)%2) * farthest + ((f)%2) * leftest, flag);
leftest++;
}
while (rightest !== (((f+1)%2) * char.x + (f%2) * char.y)){
var tile = map[((f+1)%2) * farthest + ((f)%2) * rightest][((f)%2) * farthest + ((f+1)%2) * rightest];
drawTile3d(tile, ((f)%2) * farthest + ((f+1)%2) * rightest, ((f+1)%2) * farthest + ((f)%2) * rightest, flag);
rightest--;
}
var tile = map[((f+1)%2) * farthest + ((f)%2) * char.y][((f+1)%2) * char.x + ((f)%2) * farthest];
drawTile3d(tile, ((f+1)%2) * char.x + ((f)%2) * farthest, ((f+1)%2) * farthest + ((f)%2) * char.y, flag);
drawMist(((-1 * Math.abs(2 * (f - 1.5))) + 2) * farthest - ((-1 * Math.abs(2 * (f - 1.5))) + 2) * (((f+1)%2) * char.y + ((f)%2) * char.x));
farthest += ((Math.abs(2 * (f - 1.5))) - 2)
}
if(char.stepTime > 0){
char.stepTime --;
} else if(char.stepTime < 0){
char.stepTime ++;
}
if(char.rotateTimer > 0){
char.rotateTimer -= 1;
} else if(char.rotateTimer < 0){
char.rotateTimer += 1;
}
}
function drawMist(distance){
if(distance > 1){
ctx.globalAlpha = 0.25;
ctx.fillStyle = "white";
ctx.fillRect(0, 0, width, height);
ctx.globalAlpha = 1;
}
}
function draw3dEnemy(distance, offset, rotation){
var centerY = ((distance * Math.cos(rotation)) + (offset * Math.sin(rotation)));
var centerX = ((offset * Math.cos(rotation)) - (distance * Math.sin(rotation)));
if(centerY < -0.5){
return;
}
//LLeg
drawBox(centerX - 0.0625 * Math.cos(rotation), centerY, -1.625, rotation, 0.75, 1 / 16 * Math.sqrt(2), "green", 0);
//RLeg
drawBox(centerX + 0.0625 * Math.cos(rotation), centerY, -1.625, rotation, 0.75, 1 / 16 * Math.sqrt(2), "green", 0);
// LArm
drawBox(centerX - 0.1875 * Math.cos(rotation), centerY, -0.75, rotation, 1, 1 / 16 * Math.sqrt(2), "green", 0);
//RArm
drawBox(centerX + 0.1875 * Math.cos(rotation), centerY, -0.75, rotation, 1, 1 / 16 * Math.sqrt(2), "green", 0);
//Body
drawBox(centerX, centerY, -0.75, rotation, 1, 1 / 8 * Math.sqrt(2), "green", 0);
//Head
drawBox(centerX, centerY, 0, rotation, 0.5, 1 / 8 * Math.sqrt(2), "green", 0);
}
function drawBox(centerX, centerY, centerZ, rotation, height, radius, colour, shade, faceOrderFlag){
var pt1 = pointToCanvas(centerY + (radius) * Math.sin((-3 * Math.PI / 4) + rotation), centerX + (radius) * Math.cos((-3 * Math.PI / 4) + rotation), centerZ - height/2)
var pt2 = pointToCanvas(centerY + (radius) * Math.sin((-1 * Math.PI / 4) + rotation), centerX + (radius) * Math.cos((-1 * Math.PI / 4) + rotation), centerZ - height/2);
var pt3 = pointToCanvas(centerY + (radius) * Math.sin((Math.PI / 4) + rotation), centerX + (radius) * Math.cos((Math.PI / 4) + rotation), centerZ - height/2);
var pt4 = pointToCanvas(centerY + (radius) * Math.sin((3 * Math.PI / 4) + rotation), centerX + (radius) * Math.cos((3 * Math.PI / 4) + rotation), centerZ - height/2);
var pt5 = pointToCanvas(centerY + (radius) * Math.sin((-3 * Math.PI / 4) + rotation), centerX + (radius) * Math.cos((-3 * Math.PI / 4) + rotation), centerZ + height/2)
var pt6 = pointToCanvas(centerY + (radius) * Math.sin((-1 * Math.PI / 4) + rotation), centerX + (radius) * Math.cos((-1 * Math.PI / 4) + rotation), centerZ + height/2);
var pt7 = pointToCanvas(centerY + (radius) * Math.sin((Math.PI / 4) + rotation), centerX + (radius) * Math.cos((Math.PI / 4) + rotation), centerZ + height/2);
var pt8 = pointToCanvas(centerY + (radius) * Math.sin((3 * Math.PI / 4) + rotation), centerX + (radius) * Math.cos((3 * Math.PI / 4) + rotation), centerZ + height/2);
if(faceOrderFlag === 1){
drawWall4(pt1[0], pt4[0], pt8[0], pt5[0], pt1[1], pt4[1], pt8[1], pt5[1], colour);
drawWall4(pt1[0], pt2[0], pt3[0], pt4[0], pt1[1], pt2[1], pt3[1], pt4[1], colour);
drawWall4(pt5[0], pt6[0], pt7[0], pt8[0], pt5[1], pt6[1], pt7[1], pt8[1], colour);
drawWall4(pt3[0], pt4[0], pt8[0], pt7[0], pt3[1], pt4[1], pt8[1], pt7[1], colour);
drawWall4(pt1[0], pt2[0], pt6[0], pt5[0], pt1[1], pt2[1], pt6[1], pt5[1], colour);
drawWall4(pt2[0], pt3[0], pt7[0], pt6[0], pt2[1], pt3[1], pt7[1], pt6[1], shade);
return;
} else if(faceOrderFlag === -1){
drawWall4(pt2[0], pt3[0], pt7[0], pt6[0], pt2[1], pt3[1], pt7[1], pt6[1], colour);
drawWall4(pt1[0], pt2[0], pt3[0], pt4[0], pt1[1], pt2[1], pt3[1], pt4[1], colour);
drawWall4(pt5[0], pt6[0], pt7[0], pt8[0], pt5[1], pt6[1], pt7[1], pt8[1], colour);
drawWall4(pt3[0], pt4[0], pt8[0], pt7[0], pt3[1], pt4[1], pt8[1], pt7[1], colour);
drawWall4(pt1[0], pt2[0], pt6[0], pt5[0], pt1[1], pt2[1], pt6[1], pt5[1], colour);
drawWall4(pt1[0], pt4[0], pt8[0], pt5[0], pt1[1], pt4[1], pt8[1], pt5[1], shade);
return;
}
drawWall4(pt3[0], pt4[0], pt8[0], pt7[0], pt3[1], pt4[1], pt8[1], pt7[1], colour);
drawWall4(pt1[0], pt2[0], pt3[0], pt4[0], pt1[1], pt2[1], pt3[1], pt4[1], colour);
if(centerZ + (height / 2) > 0 && faceOrderFlag !== -2){
drawWall4(pt5[0], pt6[0], pt7[0], pt8[0], pt5[1], pt6[1], pt7[1], pt8[1], colour);
}
drawWall4(pt1[0], pt4[0], pt8[0], pt5[0], pt1[1], pt4[1], pt8[1], pt5[1], colour);
drawWall4(pt2[0], pt3[0], pt7[0], pt6[0], pt2[1], pt3[1], pt7[1], pt6[1], colour);
if(centerZ + (height / 2) <= 0 && faceOrderFlag !== -2){
drawWall4(pt5[0], pt6[0], pt7[0], pt8[0], pt5[1], pt6[1], pt7[1], pt8[1], colour);
}
drawWall4(pt1[0], pt2[0], pt6[0], pt5[0], pt1[1], pt2[1], pt6[1], pt5[1], shade);
}
function draw3dCube(distance, offset, colour, shade, rotation, flag){
var centerY = ((distance * Math.cos(rotation)) + (offset * Math.sin(rotation)));
var centerX = ((offset * Math.cos(rotation)) - (distance * Math.sin(rotation)));
if(centerY < -0.5){
return;
}
drawBox(centerX, centerY, 2, rotation, 8, 1 / Math.sqrt(2), colour, shade, flag);
}
function drawWall4(x1, x2, x3, x4, y1, y2, y3, y4, colour){
ctx.fillStyle = colour;
ctx.strokeStyle = "black";
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.lineTo(x3, y3);
ctx.lineTo(x4, y4);
ctx.lineTo(x1, y1);
ctx.fill();
ctx.stroke();
}
function drawWall2(x1, x2, y1, y2, colour){
drawWall4(x1, x2, x2, x1, y1, y2, 0, 0, colour);
}
function rotatePlayer(dir){
char.facing = (char.facing + dir) % 4;
if (char.facing < 0){
char.facing = 3;
}
char.rotateTimer = 6 * dir;
}
function movePlayer(dir){
originalx = char.x;
originaly = char.y;
char.x += dir * ((-1 * Math.abs(char.facing - 1)) + 1);
char.y += dir * ((-1 * Math.abs(char.facing - 2)) + 1);
if(char.x === mapSize){
window.alert("Well done! You win!\nYou finished the maze in " + timer + " steps!");
stop();
return;
}
if(getCollision(char.x, char.y)){
char.x = originalx;
char.y = originaly;
return;
}
char.stepTime = 6 * dir;
timer++;
}
function openChest(){
chestX = char.x + ((-1 * Math.abs(char.facing - 1)) + 1);
chestY = char.y + ((-1 * Math.abs(char.facing - 2)) + 1);
if([chestX, chestY] in chests){
chest = chests[[chestX, chestY]];
if(!chest.opened){
getItem(chest.item);
chest.opened = true;
return true;
}
}
}
function breakWall(){
if(char.pickaxe > 0){
wallX = char.x + ((-1 * Math.abs(char.facing - 1)) + 1);
wallY = char.y + ((-1 * Math.abs(char.facing - 2)) + 1);
if(tiles[map[wallY][wallX]]["collision"] === "true"){
if(wallX == 0 || wallX == mapSize-1 || wallY == 0 || wallY == mapSize-1){
textBox("You can't break the outermost wall!");
return;
}
map[wallY][wallX] = "g";
char.pickaxe -= 1;
}
}
}
function keyIn(event){
a = event.keyCode;
input(a);
}
function button(event){
input(parseInt(this.id));
}
function input(num){
if(char.rotateTimer !== 0 || char.stepTime !== 0){
return;
}
switch(num){
case 32:
if(!openChest()){
breakWall();
}
break;
case 37:
rotatePlayer(-1);
break;
case 38:
movePlayer(1);
break;
case 39:
rotatePlayer(1);
break;
case 40:
movePlayer(-1);
break;
default:
return;
}
}
function getCollision(x,y){
if(x<0 || y<0 || y>=map.length || x>=map[0].length || tiles[map[y][x]]["collision"] === "true" || [x, y] in chests){
return true;
}
return false;
}
function collisionChest(x, y, flag){
if(x<0 || y<0 || y>map.length-1 || x>map[0].length-1 || tiles[map[y][x]]["collision"] === "true" || (x === char.x && y === char.y && flag)){
return true;
}
return false;
}
function makeMaze(){
var maze=[];
for(var y=0;y<mapSize;y++){
row=[];
for(var x=0;x<mapSize;x++){
row.push("w");
}
maze.push(row);
}
var startY=randomMazeLocation(0, 1, 0, mapSize - 1)[1];
var endY=randomMazeLocation(0, 1, 0, mapSize - 1)[1];
maze[startY][1]="g";
char.x=1;
char.y=startY;
var walls = addWalls(1,startY,[]);
while(walls.length>0){
index = randomNumber(0,walls.length-1)
wall = walls[index];
ret=checkWall(wall,maze,walls);
maze=ret[0];
walls=ret[1];
var index = walls.indexOf(wall);
if(index > -1){
walls.splice(index,1);
}
}
map=maze;
map[endY][mapSize-1] = "g";
addChests();
// addEnemies();
}
function addChests(){
for (var x = 1; x < mapSize-1; x++){
for (var y = 1; y < mapSize-1; y++){
if(!collisionChest(x, y, true)){
var adjacentWalls = 0;
var openSpace = 0;
for (var i = 0; i < 4; i++){
x1 = x + ((-1 * Math.abs(i - 1)) + 1);
y1 = y + ((-1 * Math.abs(i - 2)) + 1);
if(collisionChest(x1, y1, false)){
adjacentWalls++;
} else{
openSpace = i;
}
}
randomChest = 0;
if(difficulty == 0){
randomChest = randomNumber(0, 3);
} else if(difficulty == 1){
randomChest = randomNumber(0, 9);
} else if(difficulty == 2){
randomChest = randomNumber(0, 12);
}
if(adjacentWalls === 3 && randomChest === 0){
var chest = {
x : x,
y : y,
item : randomNumber(0, 2),
facing : openSpace,
opened : false,
}
chests[[x, y]] = chest;
}
}
}
}
}
function getItem(item){
if(item === 0){
if(!char.compass){
char.compass = true;
textBox("You found a compass.");
}else{
getItem(1);
}
} else if(item === 1){
char.map = true;
for(var x = char.x - 10; x < char.x + 10; x++){
for(var y = char.y - 10; y < char.y + 10; y++){
if(!visited(x, y) && x > 0 && x < mapSize && y > 0 && y < mapSize){
visitedTiles.push([x, y]);
}
}
}
textBox("You found a map.");
} else if(item === 2){
char.pickaxe += 1;
textBox("You found a pickaxe. Press Space in front of a wall to destroy it. You may not destroy the outermost wall.");
}
}
function textBox(text){
setTimeout(removeTextBox, 5000);
textBoxText = text;
}
function removeTextBox(){
textBoxText = "";
}
function checkWall(wall,maze,walls){
if(wall.d==="l" && wall.x>=2 && maze[wall.y][wall.x-2]==="w"){
maze[wall.y][wall.x-1]="g";
maze[wall.y][wall.x-2]="g";
walls=addWalls(wall.x-2,wall.y,walls);
} else if(wall.d==="u" && wall.y>=2 && maze[wall.y-2][wall.x]==="w"){
maze[wall.y-1][wall.x]="g";
maze[wall.y-2][wall.x]="g";
walls=addWalls(wall.x,wall.y-2,walls);
} else if(wall.d==="r" && wall.x<maze[0].length-2 && maze[wall.y][wall.x+2]==="w"){
maze[wall.y][wall.x+1]="g";
maze[wall.y][wall.x+2]="g";
walls=addWalls(wall.x+2,wall.y,walls);
} else if(wall.d==="d" && wall.y < maze.length-2 && maze[wall.y+2][wall.x]==="w"){
maze[wall.y+1][wall.x]="g";
maze[wall.y+2][wall.x]="g";
walls=addWalls(wall.x,wall.y+2,walls);
}
return [maze,walls];
}
function addWalls(x,y,walls){
if(x-1>=0){
walls.push({x:x,y:y,d:"l"});
}
if(y-1>=0){
walls.push({x:x,y:y,d:"u"});
}
if(x+1<mapSize){
walls.push({x:x,y:y,d:"r"});
}
if(y+1<mapSize){
walls.push({x:x,y:y,d:"d"});
}
return walls;
}
function stop(){
clearInterval(interval);
document.removeEventListener("keydown", keyIn);
name = window.prompt("Enter your name to save this score in the leaderboard or press cancel to try again!", "anon");
if(name === 'null'){
window.location.reload();
}else{
while(name.trim() === "" || name.length > 20){
name = window.prompt("That is not a valid name.", "anon");
}
var url = 'submit_score.py';
request = new XMLHttpRequest();
request.addEventListener('readystatechange', response, false);
request.open('POST', url, true);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send("name="+name.trim()+"&score="+timer+"&difficulty="+difficulty+"&version="+version);
}
}
function response() {
if ( request.readyState === 4 ) {
if ( request.status === 200 ) {
if ( request.responseText.trim() === '0' ) {
getLeaderboard(difficulty);
} else {
getLeaderboard(difficulty);
}
}
}
}
function getLeaderboard(diff){
var url = 'leaderboard.py?difficulty='+diff+'&page='+page;
request = new XMLHttpRequest();
request.addEventListener('readystatechange', displayLeaderboard, false);
request.open('GET', url, true);
request.send(null);
}
function displayLeaderboard(){
if ( request.readyState === 4 ) {
if ( request.status === 200 ) {
if ( request.responseText.trim() !== '1' ) {
ctx.fillStyle = "white";
ctx.fillRect(20, 20, width - 40, height - 40);
ctx.font="18px Georgia";
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.fillStyle = "black";
ctx.strokeStyle = "black";
ctx.beginPath();
var i = 40;
while (i < height-20){
ctx.moveTo(20, i);
ctx.lineTo(width-20, i);
i += 20;
}
ctx.moveTo(width/2, 40);
ctx.lineTo(width/2, height-20);
ctx.stroke();
var title = "";
if(difficulty == 0){
title = "Easy Leaderboard";
} else if(difficulty == 1){
title = "Normal Leaderboard";
} else if(difficulty == 2){
title = "Hard Leaderboard";
}
ctx.fillText(title, width/2, 32);
ctx.fillText("Name", width/4, 52);
ctx.fillText("Score", 3*width/4, 52);
result = request.responseText;
lines = result.split("\n");
for(var i = 0; i < lines.length; i++){
line = lines[i];
if(line === ""){
break;
}
name = line.split(",")[0];
name = name.substr(1, name.length-2);
score = line.split(",")[1];
h = 72 + i*20;
ctx.fillText(name, width/4, h);
ctx.fillText(score, 3*width/4, h);
}
if(lines.slice(-2,-1)[0][0] == "1"){
ctx.fillText("Next Page", 3*width/4, height-28);
hasNextPage = true;
rectNext = {x: width/2, y: height-40, width: width/2-20, height: 20};
}
if(lines.slice(-2,-1)[0][1] == "1"){
ctx.fillText("Previous Page", width/4, height-28);
hasPrevPage = true;
rectPrev = {x: 20, y: height-40, width:width/2-20, height: 20};
}
if(hasNextPage || hasPrevPage){
canvas.addEventListener("click",clickLeaderboard);
}
}
}
}
}
function clickLeaderboard(event){
var mousePos = getMousePos(canvas, event);
if (isInside(mousePos, rectNext) && hasNextPage) {
hasNextPage = false;
page += 1;
}else if(isInside(mousePos, rectPrev) && hasPrevPage) {
hasPrevPage = false;
page -= 1;
}else{
return;
}
canvas.removeEventListener("click",clickLeaderboard);
getLeaderboard(difficulty);
}
function setup(){
makeMaze();
}
function randomMazeLocation(xStart, yStart, xEnd, yEnd){
var xOut = randomNumber(xStart, xEnd);
var yOut = randomNumber(yStart, yEnd);
if(yOut%2 === 0){
yOut++;
if(yOut >= mapSize){
yOut -= 2;
}
}
if(xOut%2 === 0){
xOut++;
if(xOut >= mapSize){
xOut -= 2;
}
}
return [xOut, yOut];
}
function randomNumber(min, max){
return Math.floor(Math.random() * (max - min + 1)) + min;
}
})();
Editor is loading...