function Block(X, Y, I) {
ctx.fillRect(X, Y, I.h, I.w);
level.forEach(function(brick){
blocks.push( new Block(I*20, R*20) );
blocks.push( new Dot(I*20, R*20) );
players.push( new Player(I*20, R*20) );
blocks.push( new Pill(I*20, R*20) );
ghosts.push( new Ghost(I*20, R*20) );
function Player(X, Y, I) {
var keysdisabled = new Array();
ctx.fillRect(I.X, I.Y, I.h, I.w);
if ( I.X + I.speed >= c.width - I.w) {
if ( I.X + I.speed <= 0 ) {
if ( I.Y + I.speed <= 0 ) {
if ( I.Y + I.speed >= c.height - I.h ) {
I.pos['me'] = getPosition(I.X,I.Y);
I.pos['above'] = I.pos['me'] - 40;
I.pos['below'] = I.pos['me'] + 40;
I.pos['right'] = I.pos['me'] + 1;
I.pos['left'] = I.pos['me'] - 1;
if ( I.X % 20 === 0 && I.Y % 20 === 0 ) {
if ( keydown.Right == true && maps[0][I.pos['right']] != 1 ) {
if ( keydown.Left == true && maps[0][I.pos['left']] != 1 ) {
if ( keydown.Up == true && maps[0][I.pos['above']] != 1 ) {
if ( keydown.Down == true && maps[0][I.pos['below']] != 1 ) {
if ( keydown.Space == true ) {
blocks.forEach(function(block) {
var collide = collideDetect(I, block);
if ( block.type == 2 || block.type == 4 ) {
if ( block.active == true ) remainingDots++;
if ( collide != false && block.type == 1) {
if ( collide != false && block.type == 2 && block.active == true ) {
if ( collide != false && block.type == 4 && block.active == true ) {
ghosts.forEach(function(ghost){
var collide = collideDetect(I, ghost);
if ( collide != false && power == 0) {
if ( lives == 0 ) paused = 1;
ghosts.forEach(function(ghost){
} else if ( collide != false && power ==1 ){
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,1,
1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,
1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,
1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,
1,2,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,
1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,
1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,1,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,
1,1,1,1,1,1,1,1,1,2,1,2,1,0,0,0,0,0,5,5,5,5,0,0,0,0,0,1,2,1,2,1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,1,2,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,2,1,0,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,
1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,
1,2,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,
1,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,1,
1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,1,1,
1,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
if ( I.active == true ) {
var dotX = (I.X) + (I.w / 2) -1;
var dotY = (I.Y) + (I.h / 2) -1;
ctx.fillRect(dotX, dotY, 2, 2);
if ( I.active == true ) {
var dotX = (I.X) + (I.w / 2) -3;
var dotY = (I.Y) + (I.h / 2) -3;
ctx.fillRect(dotX, dotY, 6, 6);
ctx.fillText("Score: "+score, 10, 420);
ctx.fillText("Lives: "+lives, 10, 440);
if ( lives < 0 ) ctx.fillText("Game Over!", 10, 460);
function Ghost(X, Y, I) {
var keysdisabled = new Array();
ctx.fillRect(I.X, I.Y, I.h, I.w);
} else if ( power == 1 ) {
ctx.fillRect(I.X, I.Y, I.h, I.w);
if ( I.X + I.speed >= c.width - I.w) {
if ( I.X + I.speed <= 0 ) {
if ( I.Y + I.speed <= 0 ) {
if ( I.Y + I.speed >= c.height - I.h ) {
I.pos['me'] = getPosition(I.X,I.Y);
I.pos['above'] = I.pos['me'] - 40;
I.pos['below'] = I.pos['me'] + 40;
I.pos['right'] = I.pos['me'] + 1;
I.pos['left'] = I.pos['me'] - 1;
if ( I.X % 20 === 0 && I.Y % 20 === 0 ) {
var directions = new Array();
for ( var key in I.pos ) {
if ( maps[0][I.pos[key]] != 1 && key != "me") {
if ( I.direction == 'l' && key != 'right') directions.push(key);
if ( I.direction == 'r' && key != 'left') directions.push(key);
if ( I.direction == 'u' && key != 'below') directions.push(key);
if ( I.direction == 'd' && key != 'above') directions.push(key);
if ( I.direction == 's' ) directions.push(key);
var rnd = Math.floor( (Math.random()*directions.length) +0);
switch(directions[rnd]) {
blocks.forEach(function(block) {
var collide = collideDetect(I, block);
if ( collide != false && block.type == 1) {
if ( powerTimer == 0 ) powerTimer = H.getTime();
if ( H.getTime() > powerTimer + 10000 ) {
var c = document.getElementById('gameCanvas');
var ctx = c.getContext("2d");
var players = new Array();
var blocks = new Array();
var ghosts = new Array();
if ( paused == 1 ) return;
players.forEach(function(player){
if ( remainingDots == 0 ) {
ghosts.forEach(function(ghost){
if ( paused == 1 ) return;
ctx.fillRect(0, 0, 800, 600);
blocks.forEach(function(block) {
players.forEach(function(player){
ghosts.forEach(function(ghost){
function collideDetect(player, block) {
if ( player.Y == block.Y && player.X < block.X + block.w && player.X > block.X ) {
return {'X':X, 'Y':Y, 'D':'l'};
if ( player.Y == block.Y && player.X + player.w > block.X && player.X < block.X + block.w ) {
return {'X':X, 'Y':Y, 'D':'l'};
if ( player.X == block.X && player.Y + player.h > block.Y && player.Y + player.h < block.Y + block.h ) {
return {'X':X, 'Y':Y, 'D':'l'};
if ( player.X == block.X && player.Y < block.Y + block.h && player.Y > block.Y ) {
return {'X':X, 'Y':Y, 'D':'l'};
function getPosition(X, Y) {
var blockID = (blockY * 40) + blockX;
window.onkeydown = function(e) {
window.onkeyup = function(e) {