/**** 
* Classes
****/ 
var Chimney = Container.expand(function () {
	var self = Container.call(this);
	var chimneyGraphics = self.attachAsset('chimney', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.originalTint = 0xFFFFFF;
	self.presentDeliveredTint = 0x808080;
	self.hasPresent = false;
	self.speed = 2;
	self._move_migrated = function () {
		self.x -= self.speed;
		if (self.x < -self.width) {
			self.x = 2048;
		}
	};
	self.checkCollision = function () {};
});
var Hazard = Container.expand(function () {
	var self = Container.call(this);
	var hazardGraphics = self.attachAsset('hazard', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self._move_migrated = function () {
		self.x -= self.speed;
		if (self.x < -self.width) {
			self.destroy();
			return true;
		}
		return false;
	};
});
var LifeIcon = Container.expand(function () {
	var self = Container.call(this);
	var lifeIconGraphics = self.attachAsset('lifeIcon', {
		anchorX: 0.5,
		anchorY: 0.5
	});
});
var Present = Container.expand(function () {
	var self = Container.call(this);
	var presentGraphics = self.attachAsset('present', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self._move_migrated = function (hazards) {
		this.y += 5;
		hazards.forEach(function (hazard) {
			var collisionBuffer = 10;
			if (this.intersects(hazard) && Math.abs(this.x - hazard.x) < (this.width + hazard.width) / 2 - collisionBuffer && Math.abs(this.y - hazard.y) < (this.height + hazard.height) / 2 - collisionBuffer) {
				LK.effects.flashObject(this, 0xff0000, 300);
				LK.setTimeout(function () {
					this.destroy();
				}.bind(this), 300);
			}
		}.bind(this));
	};
});
var PresentIcon = Container.expand(function () {
	var self = Container.call(this);
	var presentIconGraphics = self.attachAsset('presentIcon', {
		anchorX: 0.5,
		anchorY: 0.5
	});
});
var PresentTopper = Container.expand(function (speed) {
	var self = Container.call(this);
	var topperGraphics = self.attachAsset('presentTopper', {
		anchorX: 0.5,
		anchorY: 1
	});
	self.speed = speed;
	self._move_migrated = function () {
		self.x -= self.speed;
	};
});
var RandomMover = Container.expand(function () {
	var self = Container.call(this);
	var moverGraphics = self.attachAsset('randomMover', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speedX = (Math.random() * 4 - 2) * 4;
	self.speedY = (Math.random() * 4 - 2) * 4;
	self._move_migrated = function () {
		self.x += self.speedX;
		self.y += self.speedY;
		if (self.x < 0 || self.x > 2048) {
			self.speedX *= -1;
		}
		if (self.y < 0 || self.y > 2732) {
			self.speedY *= -1;
		}
	};
});
var Santa = Container.expand(function () {
	var self = Container.call(this);
	self.resetPresents = function () {
		this.presentCounter = 5;
		this.parent.presentIcons.forEach(function (icon, index) {
			icon.visible = index < this.presentCounter;
		}.bind(this));
	};
	var santaGraphics = self.attachAsset('santa', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self._move_migrated = function () {
		if (this.lastTouchPosition) {
			var dx = this.lastTouchPosition.x - this.x;
			var dy = this.lastTouchPosition.y - this.y;
			var distance = Math.sqrt(dx * dx + dy * dy);
			var speed = 10;
			if (distance > speed) {
				dx = dx / distance * speed;
				dy = dy / distance * speed;
			}
			this.x += dx;
			this.y += dy;
			if (distance < speed) {
				this.lastTouchPosition = null;
			}
		}
	};
	self.throwPresent = function () {
		if (this.presentCounter > 0) {
			var present = new Present();
			present.x = this.x;
			present.y = this.y;
			this.parent.addChild(present);
			this.parent.presents.push(present);
			this.presentCounter--;
			this.parent.presentIcons.forEach(function (icon, index) {
				icon.visible = index < this.presentCounter;
			}.bind(this));
		}
		if (this.presentCounter === 0) {
			this.parent.hazardSpeed *= 1.5;
			this.parent.hazardSpawnRate = Math.max(this.parent.hazardSpawnRate * 0.8, 20);
			this.parent.rudolph.visible = true;
		} else {
			this.parent.rudolph.visible = false;
		}
	};
});
var ScoreBackground = Container.expand(function () {
	var self = Container.call(this);
	var scoreBgGraphics = self.attachAsset('scoreBg', {
		anchorX: 0.5
	});
	scoreBgGraphics.height -= 100;
});
var Star = Container.expand(function () {
	var self = Container.call(this);
	var starGraphics = self.attachAsset('star', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 2 + Math.random() * 3;
	self._move_migrated = function () {
		self.x -= self.speed;
		if (self.x < -self.width) {
			self.destroy();
			return true;
		}
		return false;
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000
});
/**** 
* Game Code
****/ 
game.toppers = [];
game.stars = [];
var starSpawnRate = 15;
var starSpawnCounter = 0;
var santa = game.addChild(new Santa());
santa.x = 2048 / 2;
santa.y = 2732 / 2;
santa.presentDropTimer = 0;
game.lastTapTime = 0;
game.rudolph = game.addChild(new RandomMover());
game.rudolph.x = Math.random() * 2048;
game.rudolph.y = Math.random() * 2732;
game.rudolph.visible = false;
santa.lives = 3;
game.lifeIcons = [];
var lifeIconSpacing = 20;
var lifeIconSize = 64;
for (var i = 0; i < santa.lives; i++) {
	var lifeIcon = new LifeIcon();
	lifeIcon.x = lifeIconSpacing + 1050 + i * (lifeIconSize + lifeIconSpacing);
	lifeIcon.y = lifeIconSpacing + 50;
	game.lifeIcons.push(lifeIcon);
	LK.gui.topLeft.addChild(lifeIcon);
}
santa.presentCounter = 5;
game.presents = [];
var chimneys = [];
var hazards = [];
var hazardSpeed = 8;
var hazardSpawnRate = 80;
var hazardSpawnCounter = 0;
var rudolphSpawnCounter = 0;
var scoreBackground = new ScoreBackground();
scoreBackground.x = 2048 / 2 - scoreBackground.width / 2 - 880;
scoreBackground.y = 0;
game.addChild(scoreBackground);
var scoreTxt = new Text2('0', {
	size: 150,
	fill: "#ffffff",
	font: "'Press Start 2P', monospace",
	dropShadow: true,
	dropShadowColor: '#000000',
	dropShadowBlur: 4
});
game.presentIcons = [];
for (var i = 0; i < santa.presentCounter; i++) {
	var presentIcon = new PresentIcon();
	presentIcon.x = 1060 + i * (presentIcon.width + 10);
	presentIcon.y = game.lifeIcons[game.lifeIcons.length - 1].y + lifeIconSize + lifeIconSpacing;
	game.presentIcons.push(presentIcon);
	LK.gui.topLeft.addChild(presentIcon);
}
var maxChimneys = 5;
LK.on('tick', function () {
	var currentTick = LK.ticks;
	santa._move_migrated();
	if (santa.presentDropTimer++ >= 120) {
		santa.throwPresent();
		santa.presentDropTimer = 0;
	}
	game.on('down', function (x, y, obj) {
		var event = obj;
		santa.lastTouchPosition = game.toLocal(event.global);
	});
	game.toppers = game.toppers.filter(function (topper) {
		return topper.x + topper.width > 0;
	});
	game.toppers.forEach(function (topper) {
		topper._move_migrated();
	});
	if (starSpawnCounter++ >= starSpawnRate) {
		var newStar = new Star();
		newStar.x = 2048;
		newStar.y = Math.random() * (2732 * 0.8);
		game.stars.push(newStar);
		game.addChild(newStar);
		starSpawnCounter = 0;
	}
	if (chimneys.length < maxChimneys) {
		var lastChimney = chimneys[chimneys.length - 1];
		var chimneySpacing = 500;
		if (!lastChimney || lastChimney.x < 2048 - chimneySpacing) {
			var newChimney = new Chimney();
			newChimney.x = 2048;
			newChimney.y = 2732 - newChimney.height - Math.random() * 500 + 750;
			chimneys.push(newChimney);
			game.addChild(newChimney);
		}
	}
	chimneys.forEach(function (chimney) {
		chimney._move_migrated();
		game.presents.forEach(function (present, index) {
			var chimneyCollisionBuffer = 15;
			if (present.intersects(chimney) && !chimney.hasPresent && Math.abs(present.x - chimney.x) < (present.width + chimney.width) / 2 - chimneyCollisionBuffer && Math.abs(present.y - chimney.y) < (present.height + chimney.height) / 2 - chimneyCollisionBuffer) {
				present.destroy();
				game.presents.splice(index, 1);
				chimney.hasPresent = true;
				chimney.tint = chimney.presentDeliveredTint;
				var newScore = LK.getScore() + 1;
				LK.setScore(newScore);
				scoreTxt.setText(newScore.toString());
				var presentTopper = new PresentTopper(chimney.speed);
				presentTopper.x = chimney.x;
				presentTopper.y = chimney.y - chimney.height / 2;
				game.addChild(presentTopper);
				game.toppers.push(presentTopper);
			}
		});
	});
	chimneys = chimneys.filter(function (chimney) {
		if (chimney.x + chimney.width <= 0) {
			chimney.destroy();
			return false;
		}
		return true;
	});
});
scoreTxt.anchor.set(.5, 0);
scoreTxt.y += 15;
LK.gui.top.addChild(scoreBackground);
LK.gui.top.addChild(scoreTxt);
LK.on('tick', function () {
	for (var i = game.presents.length - 1; i >= 0; i--) {
		game.presents[i]._move_migrated(hazards);
	}
	for (var i = chimneys.length - 1; i >= 0; i--) {
		chimneys[i].checkCollision();
	}
	if (hazardSpawnCounter++ >= hazardSpawnRate) {
		var newHazard = new Hazard();
		newHazard.x = 2048;
		newHazard.y = Math.random() * 2732;
		newHazard.speed = hazardSpeed;
		hazards.unshift(newHazard);
		game.addChild(newHazard);
		hazardSpawnCounter = 0;
	}
	hazards = hazards.filter(function (hazard) {
		return !hazard._move_migrated();
	});
	var santaHit = false;
	hazards.forEach(function (hazard, index) {
		var santaCollisionBuffer = 15;
		if (!santaHit && santa.intersects(hazard) && Math.abs(santa.x - hazard.x) < (santa.width + hazard.width) / 2 - santaCollisionBuffer && Math.abs(santa.y - hazard.y) < (santa.height + hazard.height) / 2 - santaCollisionBuffer) {
			LK.effects.flashObject(santa, 0xffff00, 500);
			hazard.destroy();
			hazards.splice(index, 1);
			santaHit = true;
			santa.lives--;
			if (game.lifeIcons.length > santa.lives) {
				var removedLifeIcon = game.lifeIcons.pop();
				removedLifeIcon.destroy();
			}
			if (santa.lives <= 0) {
				LK.showGameOver();
			}
		}
	});
	hazards = hazards.filter(function (hazard) {
		return !hazard.hitSanta;
	});
	game.stars.forEach(function (star, index) {
		if (star._move_migrated()) {
			star.destroy();
			game.stars.splice(index, 1);
		}
	});
	game.rudolph._move_migrated();
	if (game.rudolph.visible && santa.intersects(game.rudolph)) {
		santa.resetPresents();
		game.rudolph.visible = false;
	}
}); /**** 
* Classes
****/ 
var Chimney = Container.expand(function () {
	var self = Container.call(this);
	var chimneyGraphics = self.attachAsset('chimney', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.originalTint = 0xFFFFFF;
	self.presentDeliveredTint = 0x808080;
	self.hasPresent = false;
	self.speed = 2;
	self._move_migrated = function () {
		self.x -= self.speed;
		if (self.x < -self.width) {
			self.x = 2048;
		}
	};
	self.checkCollision = function () {};
});
var Hazard = Container.expand(function () {
	var self = Container.call(this);
	var hazardGraphics = self.attachAsset('hazard', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self._move_migrated = function () {
		self.x -= self.speed;
		if (self.x < -self.width) {
			self.destroy();
			return true;
		}
		return false;
	};
});
var LifeIcon = Container.expand(function () {
	var self = Container.call(this);
	var lifeIconGraphics = self.attachAsset('lifeIcon', {
		anchorX: 0.5,
		anchorY: 0.5
	});
});
var Present = Container.expand(function () {
	var self = Container.call(this);
	var presentGraphics = self.attachAsset('present', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self._move_migrated = function (hazards) {
		this.y += 5;
		hazards.forEach(function (hazard) {
			var collisionBuffer = 10;
			if (this.intersects(hazard) && Math.abs(this.x - hazard.x) < (this.width + hazard.width) / 2 - collisionBuffer && Math.abs(this.y - hazard.y) < (this.height + hazard.height) / 2 - collisionBuffer) {
				LK.effects.flashObject(this, 0xff0000, 300);
				LK.setTimeout(function () {
					this.destroy();
				}.bind(this), 300);
			}
		}.bind(this));
	};
});
var PresentIcon = Container.expand(function () {
	var self = Container.call(this);
	var presentIconGraphics = self.attachAsset('presentIcon', {
		anchorX: 0.5,
		anchorY: 0.5
	});
});
var PresentTopper = Container.expand(function (speed) {
	var self = Container.call(this);
	var topperGraphics = self.attachAsset('presentTopper', {
		anchorX: 0.5,
		anchorY: 1
	});
	self.speed = speed;
	self._move_migrated = function () {
		self.x -= self.speed;
	};
});
var RandomMover = Container.expand(function () {
	var self = Container.call(this);
	var moverGraphics = self.attachAsset('randomMover', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speedX = (Math.random() * 4 - 2) * 4;
	self.speedY = (Math.random() * 4 - 2) * 4;
	self._move_migrated = function () {
		self.x += self.speedX;
		self.y += self.speedY;
		if (self.x < 0 || self.x > 2048) {
			self.speedX *= -1;
		}
		if (self.y < 0 || self.y > 2732) {
			self.speedY *= -1;
		}
	};
});
var Santa = Container.expand(function () {
	var self = Container.call(this);
	self.resetPresents = function () {
		this.presentCounter = 5;
		this.parent.presentIcons.forEach(function (icon, index) {
			icon.visible = index < this.presentCounter;
		}.bind(this));
	};
	var santaGraphics = self.attachAsset('santa', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self._move_migrated = function () {
		if (this.lastTouchPosition) {
			var dx = this.lastTouchPosition.x - this.x;
			var dy = this.lastTouchPosition.y - this.y;
			var distance = Math.sqrt(dx * dx + dy * dy);
			var speed = 10;
			if (distance > speed) {
				dx = dx / distance * speed;
				dy = dy / distance * speed;
			}
			this.x += dx;
			this.y += dy;
			if (distance < speed) {
				this.lastTouchPosition = null;
			}
		}
	};
	self.throwPresent = function () {
		if (this.presentCounter > 0) {
			var present = new Present();
			present.x = this.x;
			present.y = this.y;
			this.parent.addChild(present);
			this.parent.presents.push(present);
			this.presentCounter--;
			this.parent.presentIcons.forEach(function (icon, index) {
				icon.visible = index < this.presentCounter;
			}.bind(this));
		}
		if (this.presentCounter === 0) {
			this.parent.hazardSpeed *= 1.5;
			this.parent.hazardSpawnRate = Math.max(this.parent.hazardSpawnRate * 0.8, 20);
			this.parent.rudolph.visible = true;
		} else {
			this.parent.rudolph.visible = false;
		}
	};
});
var ScoreBackground = Container.expand(function () {
	var self = Container.call(this);
	var scoreBgGraphics = self.attachAsset('scoreBg', {
		anchorX: 0.5
	});
	scoreBgGraphics.height -= 100;
});
var Star = Container.expand(function () {
	var self = Container.call(this);
	var starGraphics = self.attachAsset('star', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 2 + Math.random() * 3;
	self._move_migrated = function () {
		self.x -= self.speed;
		if (self.x < -self.width) {
			self.destroy();
			return true;
		}
		return false;
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000
});
/**** 
* Game Code
****/ 
game.toppers = [];
game.stars = [];
var starSpawnRate = 15;
var starSpawnCounter = 0;
var santa = game.addChild(new Santa());
santa.x = 2048 / 2;
santa.y = 2732 / 2;
santa.presentDropTimer = 0;
game.lastTapTime = 0;
game.rudolph = game.addChild(new RandomMover());
game.rudolph.x = Math.random() * 2048;
game.rudolph.y = Math.random() * 2732;
game.rudolph.visible = false;
santa.lives = 3;
game.lifeIcons = [];
var lifeIconSpacing = 20;
var lifeIconSize = 64;
for (var i = 0; i < santa.lives; i++) {
	var lifeIcon = new LifeIcon();
	lifeIcon.x = lifeIconSpacing + 1050 + i * (lifeIconSize + lifeIconSpacing);
	lifeIcon.y = lifeIconSpacing + 50;
	game.lifeIcons.push(lifeIcon);
	LK.gui.topLeft.addChild(lifeIcon);
}
santa.presentCounter = 5;
game.presents = [];
var chimneys = [];
var hazards = [];
var hazardSpeed = 8;
var hazardSpawnRate = 80;
var hazardSpawnCounter = 0;
var rudolphSpawnCounter = 0;
var scoreBackground = new ScoreBackground();
scoreBackground.x = 2048 / 2 - scoreBackground.width / 2 - 880;
scoreBackground.y = 0;
game.addChild(scoreBackground);
var scoreTxt = new Text2('0', {
	size: 150,
	fill: "#ffffff",
	font: "'Press Start 2P', monospace",
	dropShadow: true,
	dropShadowColor: '#000000',
	dropShadowBlur: 4
});
game.presentIcons = [];
for (var i = 0; i < santa.presentCounter; i++) {
	var presentIcon = new PresentIcon();
	presentIcon.x = 1060 + i * (presentIcon.width + 10);
	presentIcon.y = game.lifeIcons[game.lifeIcons.length - 1].y + lifeIconSize + lifeIconSpacing;
	game.presentIcons.push(presentIcon);
	LK.gui.topLeft.addChild(presentIcon);
}
var maxChimneys = 5;
LK.on('tick', function () {
	var currentTick = LK.ticks;
	santa._move_migrated();
	if (santa.presentDropTimer++ >= 120) {
		santa.throwPresent();
		santa.presentDropTimer = 0;
	}
	game.on('down', function (x, y, obj) {
		var event = obj;
		santa.lastTouchPosition = game.toLocal(event.global);
	});
	game.toppers = game.toppers.filter(function (topper) {
		return topper.x + topper.width > 0;
	});
	game.toppers.forEach(function (topper) {
		topper._move_migrated();
	});
	if (starSpawnCounter++ >= starSpawnRate) {
		var newStar = new Star();
		newStar.x = 2048;
		newStar.y = Math.random() * (2732 * 0.8);
		game.stars.push(newStar);
		game.addChild(newStar);
		starSpawnCounter = 0;
	}
	if (chimneys.length < maxChimneys) {
		var lastChimney = chimneys[chimneys.length - 1];
		var chimneySpacing = 500;
		if (!lastChimney || lastChimney.x < 2048 - chimneySpacing) {
			var newChimney = new Chimney();
			newChimney.x = 2048;
			newChimney.y = 2732 - newChimney.height - Math.random() * 500 + 750;
			chimneys.push(newChimney);
			game.addChild(newChimney);
		}
	}
	chimneys.forEach(function (chimney) {
		chimney._move_migrated();
		game.presents.forEach(function (present, index) {
			var chimneyCollisionBuffer = 15;
			if (present.intersects(chimney) && !chimney.hasPresent && Math.abs(present.x - chimney.x) < (present.width + chimney.width) / 2 - chimneyCollisionBuffer && Math.abs(present.y - chimney.y) < (present.height + chimney.height) / 2 - chimneyCollisionBuffer) {
				present.destroy();
				game.presents.splice(index, 1);
				chimney.hasPresent = true;
				chimney.tint = chimney.presentDeliveredTint;
				var newScore = LK.getScore() + 1;
				LK.setScore(newScore);
				scoreTxt.setText(newScore.toString());
				var presentTopper = new PresentTopper(chimney.speed);
				presentTopper.x = chimney.x;
				presentTopper.y = chimney.y - chimney.height / 2;
				game.addChild(presentTopper);
				game.toppers.push(presentTopper);
			}
		});
	});
	chimneys = chimneys.filter(function (chimney) {
		if (chimney.x + chimney.width <= 0) {
			chimney.destroy();
			return false;
		}
		return true;
	});
});
scoreTxt.anchor.set(.5, 0);
scoreTxt.y += 15;
LK.gui.top.addChild(scoreBackground);
LK.gui.top.addChild(scoreTxt);
LK.on('tick', function () {
	for (var i = game.presents.length - 1; i >= 0; i--) {
		game.presents[i]._move_migrated(hazards);
	}
	for (var i = chimneys.length - 1; i >= 0; i--) {
		chimneys[i].checkCollision();
	}
	if (hazardSpawnCounter++ >= hazardSpawnRate) {
		var newHazard = new Hazard();
		newHazard.x = 2048;
		newHazard.y = Math.random() * 2732;
		newHazard.speed = hazardSpeed;
		hazards.unshift(newHazard);
		game.addChild(newHazard);
		hazardSpawnCounter = 0;
	}
	hazards = hazards.filter(function (hazard) {
		return !hazard._move_migrated();
	});
	var santaHit = false;
	hazards.forEach(function (hazard, index) {
		var santaCollisionBuffer = 15;
		if (!santaHit && santa.intersects(hazard) && Math.abs(santa.x - hazard.x) < (santa.width + hazard.width) / 2 - santaCollisionBuffer && Math.abs(santa.y - hazard.y) < (santa.height + hazard.height) / 2 - santaCollisionBuffer) {
			LK.effects.flashObject(santa, 0xffff00, 500);
			hazard.destroy();
			hazards.splice(index, 1);
			santaHit = true;
			santa.lives--;
			if (game.lifeIcons.length > santa.lives) {
				var removedLifeIcon = game.lifeIcons.pop();
				removedLifeIcon.destroy();
			}
			if (santa.lives <= 0) {
				LK.showGameOver();
			}
		}
	});
	hazards = hazards.filter(function (hazard) {
		return !hazard.hitSanta;
	});
	game.stars.forEach(function (star, index) {
		if (star._move_migrated()) {
			star.destroy();
			game.stars.splice(index, 1);
		}
	});
	game.rudolph._move_migrated();
	if (game.rudolph.visible && santa.intersects(game.rudolph)) {
		santa.resetPresents();
		game.rudolph.visible = false;
	}
});
 
 8-bit cloud with lightning. in game asset. white cloude. yellow lighning. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
 
 
 
 8 bit x mas pressent. in game asset. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
 
 
 8-bit. cartoon. santa on sledge. smiling. in game asset. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.