var BlockedFollower = Container.expand(function (enemy) {
var self = Container.call(this);
self.enemy = enemy;
self.followDuration = 500;
self.followStartTime = LK.ticks;
self.move = function () {
self.x = self.enemy.x;
self.y = self.enemy.y;
LK.setTimeout(function () {
if (self.parent) {
self.move();
}
}, LK.tickDuration);
};
});
var Star = Container.expand(function () {
var self = Container.call(this);
var starGraphics = self.createAsset('star', 'Star asset', .5, .5);
self.move = function () {
this.x += 4;
};
});
var WaveMessage = Container.expand(function (waveIndex) {
var self = Container.call(this);
var messageImage = self.createAsset('wave' + waveIndex, 'Wave ' + (waveIndex + 1) + ' Image', .5, .5);
self.addChild(messageImage);
this.setMessage = function (customMessage) {
var messageText = new Text2(customMessage, {
size: 60,
fill: "#ffffff",
font: "'Press Start 2P', monospace",
fontWeight: 'bold',
stroke: '#000000',
strokeThickness: 5,
dropShadow: true,
dropShadowColor: '#000000',
dropShadowBlur: 8,
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 12
});
messageText.anchor.set(0, .5);
messageText.x = messageImage.width / 1.5;
messageText.y = messageImage.height * 0.1;
self.addChild(messageText);
};
});
var SpatialGrid = Container.expand(function (cellSize) {
var self = Container.call(this);
self.cellSize = cellSize;
self.grid = {};
self._cellKey = function (x, y) {
var cellX = Math.floor(x / self.cellSize);
var cellY = Math.floor(y / self.cellSize);
return cellX + ':' + cellY;
};
self.insert = function (object) {
var key = self._cellKey(object.x, object.y);
if (!self.grid[key]) {
self.grid[key] = [];
}
self.grid[key].push(object);
};
self.retrieve = function (x, y) {
var key = self._cellKey(x, y);
return self.grid[key] || [];
};
self.clear = function () {
self.grid = {};
};
});
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.createAsset('hero', 'Hero character', .5, .5);
self.targetPosition = null;
self.setTargetPosition = function (x, y) {
self.targetPosition = {
x: x,
y: Math.max(y, 250)
};
};
self.move = function () {
if (self.targetPosition) {
var dx = self.targetPosition.x - this.x;
var dy = self.targetPosition.y - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
if (magnitude > 5) {
this.x += dx / magnitude * 10;
this.y += dy / magnitude * 10;
} else {
this.x = self.targetPosition.x;
this.y = self.targetPosition.y;
self.targetPosition = null;
}
}
};
self.shoot = function () {};
});
var EnemyWave0 = Container.expand(function (enemyCount) {
var self = Container.call(this);
self.enemyCount = 1;
var enemyGraphics = self.createAsset('enemyWave0', 'Enemy Wave 0 character', .5, .5);
self.move = function (heroX, heroY) {
var dx = heroX - this.x;
var dy = heroY - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
var speed = 3 + enemySpeedIncrease;
var newX = this.x + dx / magnitude * speed;
var newY = this.y + dy / magnitude * speed;
var minX = 600, maxX = 1500, minY = 100, maxY = 200;
newX = Math.max(minX, Math.min(newX, maxX));
newY = Math.max(minY, Math.min(newY, maxY));
this.x = newX;
this.y = newY;
};
});
var EnemyWave1 = Container.expand(function (enemyCount) {
var self = Container.call(this);
self.enemyCount = 10;
var enemyGraphics = self.createAsset('enemyWave1', 'Enemy Wave 1 character', .5, .5);
self.move = function (heroX, heroY) {
var dx = heroX - this.x;
var dy = heroY - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
var speed = 3 + enemySpeedIncrease;
this.x += dx / magnitude * speed;
this.y += dy / magnitude * speed;
};
});
var EnemyWave2 = Container.expand(function (enemyCount) {
var self = Container.call(this);
self.enemyCount = 5;
var enemyGraphics = self.createAsset('enemyWave2', 'Enemy Wave 2 character', .5, .5);
self.move = function (heroX, heroY) {
var dx = heroX - this.x;
var dy = heroY - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
var speed = 2 + enemySpeedIncrease;
this.x += dx / magnitude * speed;
this.y += dy / magnitude * speed;
};
});
var EnemyWave3 = Container.expand(function (enemyCount) {
var self = Container.call(this);
self.enemyCount = 6;
var enemyGraphics = self.createAsset('enemyWave3', 'Enemy Wave 3 character', .5, .5);
self.move = function (heroX, heroY) {
var dx = heroX - this.x;
var dy = heroY - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
var speed = 2.5 + enemySpeedIncrease;
this.x += dx / magnitude * speed;
this.y += dy / magnitude * speed;
};
});
var EnemyWave4 = Container.expand(function (enemyCount) {
var self = Container.call(this);
self.enemyCount = 15;
var enemyGraphics = self.createAsset('enemyWave4', 'Enemy Wave 4 character', .5, .5);
self.move = function (heroX, heroY) {
var dx = heroX - this.x;
var dy = heroY - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
var speed = 3.5 + enemySpeedIncrease;
this.x += dx / magnitude * speed;
this.y += dy / magnitude * speed;
};
});
var EnemyWave5 = Container.expand(function (enemyCount) {
var self = Container.call(this);
self.enemyCount = 1;
var enemyGraphics = self.createAsset('enemyWave5', 'Enemy Wave 5 character', .5, .5);
self.move = function (heroX, heroY) {
var dx = heroX - this.x;
var dy = heroY - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
var speed = 7 + enemySpeedIncrease;
this.x += dx / magnitude * speed;
this.y += dy / magnitude * speed;
};
});
var HeroBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('heroBullet', 'Hero Bullet', .5, .5);
self.move = function () {
this.y -= 5;
};
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('enemyBullet', 'Enemy Bullet', .5, .5);
self.move = function (heroX, heroY) {
var dx = heroX - this.x;
var dy = heroY - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
this.x += dx / magnitude * 2;
this.y += dy / magnitude * 2;
};
});
var enemySpeedIncrease = 0;
var Game = Container.expand(function () {
var self = Container.call(this);
stage.on('down', function (obj) {
var pos = obj.event.getLocalPosition(self);
hero.setTargetPosition(pos.x, pos.y);
});
var background = self.createAsset('background', 'Game Background', 0, 0);
background.width = 2048;
background.height = 2532;
background.y = 200;
self.addChild(background);
var centerLine = self.createAsset('whiteLine', 'Center Line', 0, 0);
centerLine.width = 2048;
centerLine.height = 10;
centerLine.y = 2732 / 2;
self.addChild(centerLine);
var centerCircle = self.createAsset('centerCircle', 'Center Circle', 0.5, 0.5);
centerCircle.width = 100;
centerCircle.height = 100;
centerCircle.x = 2048 / 2;
centerCircle.y = centerLine.y;
self.addChild(centerCircle);
var topArea = LK.getAsset('topArea', 'Top Area', 0, 0);
topArea.width = 2048;
topArea.height = 200;
self.addChild(topArea);
var horizontalLine = LK.getAsset('horizontalLine', 'Horizontal Line', 0, 0);
horizontalLine.width = 2048;
horizontalLine.height = 10;
horizontalLine.y = 200;
self.addChild(horizontalLine);
self.getEnemyCountForWave = function (waveIndex) {
switch (waveIndex % 6) {
case 0:
return 1;
case 1:
return 10;
case 2:
return 5;
case 3:
return 6;
case 4:
return 8;
case 5:
return 1;
}
};
var goal = self.createAsset('goal', 'Goal asset', 0.5, 0.5);
goal.width = 1100;
goal.height = 200;
goal.x = 2048 / 2;
goal.y = goal.height / 2;
self.addChild(goal);
var hero = self.addChild(new Hero());
var score = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: "#ffffff",
font: "'Press Start 2P', monospace",
dropShadow: true,
dropShadowColor: '#000000',
dropShadowBlur: 4,
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 6
});
scoreTxt.anchor.set(0, 0.5);
scoreTxt.x = 135;
scoreTxt.y = 20 + scoreTxt.height / 2;
LK.gui.addChild(scoreTxt);
scoreTxt.parent.setChildIndex(scoreTxt, scoreTxt.parent.children.length - 1);
var timerTxt = new Text2(':60', {
size: 120,
fill: "#ffffff",
font: "'Press Start 2P', monospace",
dropShadow: true,
dropShadowColor: '#000000',
dropShadowBlur: 4,
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 6
});
timerTxt.anchor.set(0.5, 0);
timerTxt.x = 2048 / 2 + 210;
timerTxt.y = 20;
self.timerTxt = timerTxt;
LK.gui.addChild(self.timerTxt);
self.timerTxt.parent.setChildIndex(self.timerTxt, self.timerTxt.parent.children.length - 1);
var enemies = [];
var waveIndex = 0;
var maxWaveCount = 6;
var waveTimer = 600;
var waveInterval = 600;
var gameTime = 60;
var gameTimer = LK.setInterval(function () {
if (gameTime > 0) {
gameTime--;
var minutes = Math.floor(gameTime / 60);
var seconds = gameTime % 60;
var formattedTime = (minutes > 0 ? minutes.toString().padStart(2, '0') : '') + ':' + seconds.toString().padStart(2, '0');
timerTxt.setText(formattedTime);
} else {
LK.clearInterval(gameTimer);
LK.showGameOver('Game Over! Your score: ' + score.toString());
}
}, 1000);
var heroBullets = [];
self.messageTimeouts = [];
var enemyBullets = [];
hero.x = 2048 / 2;
hero.y = 2732 - 700;
var bulletTimer = 0;
var bulletInterval = 100;
LK.on('tick', function () {
hero.move();
bulletTimer++;
if (bulletTimer >= bulletInterval) {
var newBullet = new HeroBullet();
newBullet.x = hero.x;
newBullet.y = hero.y;
heroBullets.push(newBullet);
self.addChild(newBullet);
bulletTimer = 0;
}
if (waveIndex < maxWaveCount) {
waveTimer++;
}
if (waveTimer >= waveInterval && waveIndex < maxWaveCount) {
var waveMessages = ['KICK OFf!', 'EMPTY', 'KIDS want a selfie!', 'Time for the PRESS!', 'HOOLIGANS incoming!!', 'SIIIUU!'];
var waveMessage = new WaveMessage(waveIndex);
waveMessage.setMessage(waveMessages[waveIndex % waveMessages.length]);
switch (waveIndex % 6) {
case 0:
waveMessage.x = 150;
waveMessage.y = 1700;
break;
case 1:
waveMessage.x = 150;
waveMessage.y = 1700;
break;
case 2:
waveMessage.x = 150;
waveMessage.y = 1700;
break;
case 3:
waveMessage.x = 150;
waveMessage.y = 1700;
break;
case 4:
waveMessage.x = 150;
waveMessage.y = 1700;
break;
case 5:
waveMessage.x = 150;
waveMessage.y = 1700;
break;
}
LK.gui.addChild(waveMessage);
LK.gui.setChildIndex(waveMessage, LK.gui.children.length - 1);
var messageTimeout = LK.setTimeout((function (waveMessageRef) {
return function () {
LK.gui.removeChild(waveMessageRef);
waveMessageRef.destroy();
};
})(waveMessage), 4000);
self.messageTimeouts.push(messageTimeout);
if (waveIndex == 0) {
for (var i = 0; i < self.getEnemyCountForWave(waveIndex); i++) {
var newEnemy = new EnemyWave0(self.getEnemyCountForWave(waveIndex));
newEnemy.x = 1000;
newEnemy.y = 300;
enemies.push(newEnemy);
self.addChild(newEnemy);
}
for (var i = 0; i < self.getEnemyCountForWave(waveIndex + 1); i++) {
var newEnemy = new EnemyWave1(self.getEnemyCountForWave(waveIndex + 1));
newEnemy.x = Math.random() * 2048;
newEnemy.y = 300;
enemies.push(newEnemy);
self.addChild(newEnemy);
}
waveIndex += 2;
} else {
for (var i = 0; i < self.getEnemyCountForWave(waveIndex); i++) {
var newEnemy;
var enemyCount = self.getEnemyCountForWave(waveIndex);
switch (waveIndex % 6) {
case 0:
newEnemy = new EnemyWave0(enemyCount);
newEnemy.x = 1000;
newEnemy.y = 0;
break;
case 1:
newEnemy = new EnemyWave1(enemyCount);
newEnemy.x = Math.random() * 2048;
newEnemy.y = 0;
break;
case 2:
newEnemy = new EnemyWave2(enemyCount);
newEnemy.x = Math.random() * 2048;
newEnemy.y = 2732;
break;
case 3:
newEnemy = new EnemyWave3(enemyCount);
var side = Math.random() < 0.5 ? 0 : 2048;
newEnemy.x = side;
newEnemy.y = Math.random() * 2732;
break;
case 4:
newEnemy = new EnemyWave4(enemyCount);
var side = Math.floor(Math.random() * 3);
switch (side) {
case 0:
newEnemy.x = 0;
newEnemy.y = Math.random() * 2732;
break;
case 1:
newEnemy.x = 2048;
newEnemy.y = Math.random() * 2732;
break;
case 2:
newEnemy.x = Math.random() * 2048;
newEnemy.y = 2732;
break;
}
break;
case 5:
newEnemy = new EnemyWave5(enemyCount);
newEnemy.x = 1000;
newEnemy.y = 2732;
break;
}
enemies.push(newEnemy);
self.addChild(newEnemy);
}
waveIndex++;
}
waveTimer = 0;
}
var spatialGrid = new SpatialGrid(100);
for (var i = 0; i < enemies.length; i++) {
spatialGrid.insert(enemies[i]);
}
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var nearbyEnemies = spatialGrid.retrieve(enemy.x, enemy.y);
enemy.move(hero.x, hero.y);
var collisionThreshold = 20;
var heroRadius = hero.width / 2;
var enemyRadius = enemy.width / 2;
var dx = hero.x - enemy.x;
var dy = hero.y - enemy.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < heroRadius + enemyRadius) {
self.messageTimeouts.forEach(function (timeout) {
LK.clearTimeout(timeout);
});
LK.gui.removeChild(self.timerTxt);
LK.showGameOver('Game Over! Your score: ' + score.toString());
LK.gui.children.forEach(function (child) {
if (child instanceof Text2) {
child.destroy();
}
});
LK.gui.removeChildren();
return;
}
for (var j = 0; j < nearbyEnemies.length; j++) {
var otherEnemy = nearbyEnemies[j];
if (otherEnemy !== enemy && enemy.intersects(otherEnemy)) {
var overlapX = enemy.x - otherEnemy.x;
var overlapY = enemy.y - otherEnemy.y;
var overlapMagnitude = Math.sqrt(overlapX * overlapX + overlapY * overlapY);
var separationDistance = 100;
for (var j = 0; j < nearbyEnemies.length; j++) {
var otherEnemy = nearbyEnemies[j];
if (otherEnemy !== enemy && enemy.intersects(otherEnemy)) {
var overlapX = enemy.x - otherEnemy.x;
var overlapY = enemy.y - otherEnemy.y;
var overlapMagnitude = Math.sqrt(overlapX * overlapX + overlapY * overlapY);
if (overlapMagnitude < separationDistance) {
var separationFactor = (separationDistance - overlapMagnitude) / overlapMagnitude;
enemy.x += overlapX / overlapMagnitude * separationFactor;
enemy.y += overlapY / overlapMagnitude * separationFactor;
otherEnemy.x -= overlapX / overlapMagnitude * separationFactor;
otherEnemy.y -= overlapY / overlapMagnitude * separationFactor;
}
}
}
}
}
}
spatialGrid.clear();
for (var i = heroBullets.length - 1; i >= 0; i--) {
heroBullets[i].move(goal.x, goal.y);
if (heroBullets[i].intersects(goal)) {
var successAsset = self.createAsset('success', 'Success Asset', .5, .5);
var dx = goal.x - heroBullets[i].x;
var dy = goal.y - heroBullets[i].y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
successAsset.x = heroBullets[i].x;
successAsset.y = heroBullets[i].y - 70;
self.addChild(successAsset);
LK.setTimeout(function () {
successAsset.destroy();
}, 1000);
heroBullets[i].destroy();
heroBullets.splice(i, 1);
score++;
enemySpeedIncrease += 0.1;
scoreTxt.setText(score.toString());
continue;
}
for (var j = 0; j < enemies.length; j++) {
if (heroBullets[i] && heroBullets[i].intersects(enemies[j])) {
heroBullets[i].destroy();
heroBullets.splice(i, 1);
break;
}
}
}
for (var i = 0; i < enemyBullets.length; i++) {
enemyBullets[i].move();
}
});
});
var BlockedFollower = Container.expand(function (enemy) {
var self = Container.call(this);
self.enemy = enemy;
self.followDuration = 500;
self.followStartTime = LK.ticks;
self.move = function () {
self.x = self.enemy.x;
self.y = self.enemy.y;
LK.setTimeout(function () {
if (self.parent) {
self.move();
}
}, LK.tickDuration);
};
});
var Star = Container.expand(function () {
var self = Container.call(this);
var starGraphics = self.createAsset('star', 'Star asset', .5, .5);
self.move = function () {
this.x += 4;
};
});
var WaveMessage = Container.expand(function (waveIndex) {
var self = Container.call(this);
var messageImage = self.createAsset('wave' + waveIndex, 'Wave ' + (waveIndex + 1) + ' Image', .5, .5);
self.addChild(messageImage);
this.setMessage = function (customMessage) {
var messageText = new Text2(customMessage, {
size: 60,
fill: "#ffffff",
font: "'Press Start 2P', monospace",
fontWeight: 'bold',
stroke: '#000000',
strokeThickness: 5,
dropShadow: true,
dropShadowColor: '#000000',
dropShadowBlur: 8,
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 12
});
messageText.anchor.set(0, .5);
messageText.x = messageImage.width / 1.5;
messageText.y = messageImage.height * 0.1;
self.addChild(messageText);
};
});
var SpatialGrid = Container.expand(function (cellSize) {
var self = Container.call(this);
self.cellSize = cellSize;
self.grid = {};
self._cellKey = function (x, y) {
var cellX = Math.floor(x / self.cellSize);
var cellY = Math.floor(y / self.cellSize);
return cellX + ':' + cellY;
};
self.insert = function (object) {
var key = self._cellKey(object.x, object.y);
if (!self.grid[key]) {
self.grid[key] = [];
}
self.grid[key].push(object);
};
self.retrieve = function (x, y) {
var key = self._cellKey(x, y);
return self.grid[key] || [];
};
self.clear = function () {
self.grid = {};
};
});
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.createAsset('hero', 'Hero character', .5, .5);
self.targetPosition = null;
self.setTargetPosition = function (x, y) {
self.targetPosition = {
x: x,
y: Math.max(y, 250)
};
};
self.move = function () {
if (self.targetPosition) {
var dx = self.targetPosition.x - this.x;
var dy = self.targetPosition.y - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
if (magnitude > 5) {
this.x += dx / magnitude * 10;
this.y += dy / magnitude * 10;
} else {
this.x = self.targetPosition.x;
this.y = self.targetPosition.y;
self.targetPosition = null;
}
}
};
self.shoot = function () {};
});
var EnemyWave0 = Container.expand(function (enemyCount) {
var self = Container.call(this);
self.enemyCount = 1;
var enemyGraphics = self.createAsset('enemyWave0', 'Enemy Wave 0 character', .5, .5);
self.move = function (heroX, heroY) {
var dx = heroX - this.x;
var dy = heroY - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
var speed = 3 + enemySpeedIncrease;
var newX = this.x + dx / magnitude * speed;
var newY = this.y + dy / magnitude * speed;
var minX = 600, maxX = 1500, minY = 100, maxY = 200;
newX = Math.max(minX, Math.min(newX, maxX));
newY = Math.max(minY, Math.min(newY, maxY));
this.x = newX;
this.y = newY;
};
});
var EnemyWave1 = Container.expand(function (enemyCount) {
var self = Container.call(this);
self.enemyCount = 10;
var enemyGraphics = self.createAsset('enemyWave1', 'Enemy Wave 1 character', .5, .5);
self.move = function (heroX, heroY) {
var dx = heroX - this.x;
var dy = heroY - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
var speed = 3 + enemySpeedIncrease;
this.x += dx / magnitude * speed;
this.y += dy / magnitude * speed;
};
});
var EnemyWave2 = Container.expand(function (enemyCount) {
var self = Container.call(this);
self.enemyCount = 5;
var enemyGraphics = self.createAsset('enemyWave2', 'Enemy Wave 2 character', .5, .5);
self.move = function (heroX, heroY) {
var dx = heroX - this.x;
var dy = heroY - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
var speed = 2 + enemySpeedIncrease;
this.x += dx / magnitude * speed;
this.y += dy / magnitude * speed;
};
});
var EnemyWave3 = Container.expand(function (enemyCount) {
var self = Container.call(this);
self.enemyCount = 6;
var enemyGraphics = self.createAsset('enemyWave3', 'Enemy Wave 3 character', .5, .5);
self.move = function (heroX, heroY) {
var dx = heroX - this.x;
var dy = heroY - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
var speed = 2.5 + enemySpeedIncrease;
this.x += dx / magnitude * speed;
this.y += dy / magnitude * speed;
};
});
var EnemyWave4 = Container.expand(function (enemyCount) {
var self = Container.call(this);
self.enemyCount = 15;
var enemyGraphics = self.createAsset('enemyWave4', 'Enemy Wave 4 character', .5, .5);
self.move = function (heroX, heroY) {
var dx = heroX - this.x;
var dy = heroY - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
var speed = 3.5 + enemySpeedIncrease;
this.x += dx / magnitude * speed;
this.y += dy / magnitude * speed;
};
});
var EnemyWave5 = Container.expand(function (enemyCount) {
var self = Container.call(this);
self.enemyCount = 1;
var enemyGraphics = self.createAsset('enemyWave5', 'Enemy Wave 5 character', .5, .5);
self.move = function (heroX, heroY) {
var dx = heroX - this.x;
var dy = heroY - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
var speed = 7 + enemySpeedIncrease;
this.x += dx / magnitude * speed;
this.y += dy / magnitude * speed;
};
});
var HeroBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('heroBullet', 'Hero Bullet', .5, .5);
self.move = function () {
this.y -= 5;
};
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('enemyBullet', 'Enemy Bullet', .5, .5);
self.move = function (heroX, heroY) {
var dx = heroX - this.x;
var dy = heroY - this.y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
this.x += dx / magnitude * 2;
this.y += dy / magnitude * 2;
};
});
var enemySpeedIncrease = 0;
var Game = Container.expand(function () {
var self = Container.call(this);
stage.on('down', function (obj) {
var pos = obj.event.getLocalPosition(self);
hero.setTargetPosition(pos.x, pos.y);
});
var background = self.createAsset('background', 'Game Background', 0, 0);
background.width = 2048;
background.height = 2532;
background.y = 200;
self.addChild(background);
var centerLine = self.createAsset('whiteLine', 'Center Line', 0, 0);
centerLine.width = 2048;
centerLine.height = 10;
centerLine.y = 2732 / 2;
self.addChild(centerLine);
var centerCircle = self.createAsset('centerCircle', 'Center Circle', 0.5, 0.5);
centerCircle.width = 100;
centerCircle.height = 100;
centerCircle.x = 2048 / 2;
centerCircle.y = centerLine.y;
self.addChild(centerCircle);
var topArea = LK.getAsset('topArea', 'Top Area', 0, 0);
topArea.width = 2048;
topArea.height = 200;
self.addChild(topArea);
var horizontalLine = LK.getAsset('horizontalLine', 'Horizontal Line', 0, 0);
horizontalLine.width = 2048;
horizontalLine.height = 10;
horizontalLine.y = 200;
self.addChild(horizontalLine);
self.getEnemyCountForWave = function (waveIndex) {
switch (waveIndex % 6) {
case 0:
return 1;
case 1:
return 10;
case 2:
return 5;
case 3:
return 6;
case 4:
return 8;
case 5:
return 1;
}
};
var goal = self.createAsset('goal', 'Goal asset', 0.5, 0.5);
goal.width = 1100;
goal.height = 200;
goal.x = 2048 / 2;
goal.y = goal.height / 2;
self.addChild(goal);
var hero = self.addChild(new Hero());
var score = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: "#ffffff",
font: "'Press Start 2P', monospace",
dropShadow: true,
dropShadowColor: '#000000',
dropShadowBlur: 4,
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 6
});
scoreTxt.anchor.set(0, 0.5);
scoreTxt.x = 135;
scoreTxt.y = 20 + scoreTxt.height / 2;
LK.gui.addChild(scoreTxt);
scoreTxt.parent.setChildIndex(scoreTxt, scoreTxt.parent.children.length - 1);
var timerTxt = new Text2(':60', {
size: 120,
fill: "#ffffff",
font: "'Press Start 2P', monospace",
dropShadow: true,
dropShadowColor: '#000000',
dropShadowBlur: 4,
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 6
});
timerTxt.anchor.set(0.5, 0);
timerTxt.x = 2048 / 2 + 210;
timerTxt.y = 20;
self.timerTxt = timerTxt;
LK.gui.addChild(self.timerTxt);
self.timerTxt.parent.setChildIndex(self.timerTxt, self.timerTxt.parent.children.length - 1);
var enemies = [];
var waveIndex = 0;
var maxWaveCount = 6;
var waveTimer = 600;
var waveInterval = 600;
var gameTime = 60;
var gameTimer = LK.setInterval(function () {
if (gameTime > 0) {
gameTime--;
var minutes = Math.floor(gameTime / 60);
var seconds = gameTime % 60;
var formattedTime = (minutes > 0 ? minutes.toString().padStart(2, '0') : '') + ':' + seconds.toString().padStart(2, '0');
timerTxt.setText(formattedTime);
} else {
LK.clearInterval(gameTimer);
LK.showGameOver('Game Over! Your score: ' + score.toString());
}
}, 1000);
var heroBullets = [];
self.messageTimeouts = [];
var enemyBullets = [];
hero.x = 2048 / 2;
hero.y = 2732 - 700;
var bulletTimer = 0;
var bulletInterval = 100;
LK.on('tick', function () {
hero.move();
bulletTimer++;
if (bulletTimer >= bulletInterval) {
var newBullet = new HeroBullet();
newBullet.x = hero.x;
newBullet.y = hero.y;
heroBullets.push(newBullet);
self.addChild(newBullet);
bulletTimer = 0;
}
if (waveIndex < maxWaveCount) {
waveTimer++;
}
if (waveTimer >= waveInterval && waveIndex < maxWaveCount) {
var waveMessages = ['KICK OFf!', 'EMPTY', 'KIDS want a selfie!', 'Time for the PRESS!', 'HOOLIGANS incoming!!', 'SIIIUU!'];
var waveMessage = new WaveMessage(waveIndex);
waveMessage.setMessage(waveMessages[waveIndex % waveMessages.length]);
switch (waveIndex % 6) {
case 0:
waveMessage.x = 150;
waveMessage.y = 1700;
break;
case 1:
waveMessage.x = 150;
waveMessage.y = 1700;
break;
case 2:
waveMessage.x = 150;
waveMessage.y = 1700;
break;
case 3:
waveMessage.x = 150;
waveMessage.y = 1700;
break;
case 4:
waveMessage.x = 150;
waveMessage.y = 1700;
break;
case 5:
waveMessage.x = 150;
waveMessage.y = 1700;
break;
}
LK.gui.addChild(waveMessage);
LK.gui.setChildIndex(waveMessage, LK.gui.children.length - 1);
var messageTimeout = LK.setTimeout((function (waveMessageRef) {
return function () {
LK.gui.removeChild(waveMessageRef);
waveMessageRef.destroy();
};
})(waveMessage), 4000);
self.messageTimeouts.push(messageTimeout);
if (waveIndex == 0) {
for (var i = 0; i < self.getEnemyCountForWave(waveIndex); i++) {
var newEnemy = new EnemyWave0(self.getEnemyCountForWave(waveIndex));
newEnemy.x = 1000;
newEnemy.y = 300;
enemies.push(newEnemy);
self.addChild(newEnemy);
}
for (var i = 0; i < self.getEnemyCountForWave(waveIndex + 1); i++) {
var newEnemy = new EnemyWave1(self.getEnemyCountForWave(waveIndex + 1));
newEnemy.x = Math.random() * 2048;
newEnemy.y = 300;
enemies.push(newEnemy);
self.addChild(newEnemy);
}
waveIndex += 2;
} else {
for (var i = 0; i < self.getEnemyCountForWave(waveIndex); i++) {
var newEnemy;
var enemyCount = self.getEnemyCountForWave(waveIndex);
switch (waveIndex % 6) {
case 0:
newEnemy = new EnemyWave0(enemyCount);
newEnemy.x = 1000;
newEnemy.y = 0;
break;
case 1:
newEnemy = new EnemyWave1(enemyCount);
newEnemy.x = Math.random() * 2048;
newEnemy.y = 0;
break;
case 2:
newEnemy = new EnemyWave2(enemyCount);
newEnemy.x = Math.random() * 2048;
newEnemy.y = 2732;
break;
case 3:
newEnemy = new EnemyWave3(enemyCount);
var side = Math.random() < 0.5 ? 0 : 2048;
newEnemy.x = side;
newEnemy.y = Math.random() * 2732;
break;
case 4:
newEnemy = new EnemyWave4(enemyCount);
var side = Math.floor(Math.random() * 3);
switch (side) {
case 0:
newEnemy.x = 0;
newEnemy.y = Math.random() * 2732;
break;
case 1:
newEnemy.x = 2048;
newEnemy.y = Math.random() * 2732;
break;
case 2:
newEnemy.x = Math.random() * 2048;
newEnemy.y = 2732;
break;
}
break;
case 5:
newEnemy = new EnemyWave5(enemyCount);
newEnemy.x = 1000;
newEnemy.y = 2732;
break;
}
enemies.push(newEnemy);
self.addChild(newEnemy);
}
waveIndex++;
}
waveTimer = 0;
}
var spatialGrid = new SpatialGrid(100);
for (var i = 0; i < enemies.length; i++) {
spatialGrid.insert(enemies[i]);
}
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var nearbyEnemies = spatialGrid.retrieve(enemy.x, enemy.y);
enemy.move(hero.x, hero.y);
var collisionThreshold = 20;
var heroRadius = hero.width / 2;
var enemyRadius = enemy.width / 2;
var dx = hero.x - enemy.x;
var dy = hero.y - enemy.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < heroRadius + enemyRadius) {
self.messageTimeouts.forEach(function (timeout) {
LK.clearTimeout(timeout);
});
LK.gui.removeChild(self.timerTxt);
LK.showGameOver('Game Over! Your score: ' + score.toString());
LK.gui.children.forEach(function (child) {
if (child instanceof Text2) {
child.destroy();
}
});
LK.gui.removeChildren();
return;
}
for (var j = 0; j < nearbyEnemies.length; j++) {
var otherEnemy = nearbyEnemies[j];
if (otherEnemy !== enemy && enemy.intersects(otherEnemy)) {
var overlapX = enemy.x - otherEnemy.x;
var overlapY = enemy.y - otherEnemy.y;
var overlapMagnitude = Math.sqrt(overlapX * overlapX + overlapY * overlapY);
var separationDistance = 100;
for (var j = 0; j < nearbyEnemies.length; j++) {
var otherEnemy = nearbyEnemies[j];
if (otherEnemy !== enemy && enemy.intersects(otherEnemy)) {
var overlapX = enemy.x - otherEnemy.x;
var overlapY = enemy.y - otherEnemy.y;
var overlapMagnitude = Math.sqrt(overlapX * overlapX + overlapY * overlapY);
if (overlapMagnitude < separationDistance) {
var separationFactor = (separationDistance - overlapMagnitude) / overlapMagnitude;
enemy.x += overlapX / overlapMagnitude * separationFactor;
enemy.y += overlapY / overlapMagnitude * separationFactor;
otherEnemy.x -= overlapX / overlapMagnitude * separationFactor;
otherEnemy.y -= overlapY / overlapMagnitude * separationFactor;
}
}
}
}
}
}
spatialGrid.clear();
for (var i = heroBullets.length - 1; i >= 0; i--) {
heroBullets[i].move(goal.x, goal.y);
if (heroBullets[i].intersects(goal)) {
var successAsset = self.createAsset('success', 'Success Asset', .5, .5);
var dx = goal.x - heroBullets[i].x;
var dy = goal.y - heroBullets[i].y;
var magnitude = Math.sqrt(dx * dx + dy * dy);
successAsset.x = heroBullets[i].x;
successAsset.y = heroBullets[i].y - 70;
self.addChild(successAsset);
LK.setTimeout(function () {
successAsset.destroy();
}, 1000);
heroBullets[i].destroy();
heroBullets.splice(i, 1);
score++;
enemySpeedIncrease += 0.1;
scoreTxt.setText(score.toString());
continue;
}
for (var j = 0; j < enemies.length; j++) {
if (heroBullets[i] && heroBullets[i].intersects(enemies[j])) {
heroBullets[i].destroy();
heroBullets.splice(i, 1);
break;
}
}
}
for (var i = 0; i < enemyBullets.length; i++) {
enemyBullets[i].move();
}
});
});