var gameState = 0;
var candiesNumber = 11 - 10;
var isAnimatingEnd = false;
var playerMode = 0;
var playerTurn = true;
var playerSelecting = false;
var computerArmOffset = 120;
var lastCandyY = 0;
var debug = false;
function addShadow(name, x, y) {
var shadow = new Container();
shadow.createAsset(name, name, 0, 0);
shadow.width = name === 'candyCaneShadow' ? shadow.width / 4 : shadow.width;
shadow.x = x;
shadow.y = y;
shadow.alpha = 0.8;
return shadow;
}
function addShadows(self, x1, x2, x3, y) {
self.addChildAt(addShadow('candyCaneShadow', x1, y), 0);
self.addChildAt(addShadow('candyCaneShadow', x2, y), 0);
self.addChildAt(addShadow('candyCaneShadowCentral', x3, y), 0);
}
function fade(target, duration, fadeIn, callback) {
var alphaTarget = fadeIn ? 1 : 0;
var alphaDelta = (alphaTarget - target.alpha) / (duration / (1000 / 60));
var fadeInterval = LK.setInterval(function () {
if (fadeIn && target.alpha < 1 || !fadeIn && target.alpha > 0) {
target.alpha += alphaDelta;
if (fadeIn && target.alpha >= 1 || !fadeIn && target.alpha <= 0) {
target.alpha = alphaTarget;
LK.clearInterval(fadeInterval);
if (typeof callback === 'function') {
callback();
}
}
}
}, 1000 / 60);
}
function enlargeCadyCanes(candyCanes, number) {
if (debug) {
console.log("enlargeCadyCanes : " + number + "/" + candyCanes.length);
}
for (var i = 0; i < candyCanes.length; i++) {
if (i < number) {
candyCanes[i].scale.set(1.1);
} else {
candyCanes[i].scale.set(1);
}
}
}
function handleSelection(obj, player, candyCanes, isPlayerTwo) {
if (candyCanes.length === 0) {
return;
}
var event = obj.event;
var pos = event.getLocalPosition(player.parent);
var minY = candyCanes[0].y + 120;
var maxY = candyCanes.length > 2 ? candyCanes[2].y + 140 : candyCanes[candyCanes.length - 1].y + 140;
minY += isPlayerTwo ? computerArmOffset : 0;
maxY += isPlayerTwo ? computerArmOffset : 0;
player.y = Math.max(minY, Math.min(maxY, pos.y));
if (!playerSelecting) {
return;
}
if (player.y < candyCanes[0].y + 240) {
player.parent.selectedCandiesCount = 1;
} else if (player.y < candyCanes[1].y + 240) {
player.parent.selectedCandiesCount = 2;
} else if (player.y < candyCanes[2].y + 240) {
player.parent.selectedCandiesCount = 3;
}
enlargeCadyCanes(candyCanes, player.parent.selectedCandiesCount);
if (debug) {
console.log("handleSelection : minY=" + minY + " / isPlayerTwo ? " + isPlayerTwo);
}
}
function handleGameEnd(self, win, playerMode) {
if (debug) {
console.log("handleGameEnd...win = " + win + " playerMode = " + playerMode);
}
gameState = 2;
isAnimatingEnd = true;
var explosion = self.addChild(new Explosion());
explosion.animate();
LK.setTimeout(function () {
var endBackground = win ? 'winBackground' : 'loseBackground';
var backgroundAsset = self.createAsset(endBackground, 'End Game Background', 0.5, 0.5);
backgroundAsset.x = 2048 / 2;
backgroundAsset.y = 2732 / 2;
self.addChild(backgroundAsset);
if (playerMode === 2) {
var shadow = new Container();
shadow.createAsset('candyCaneShadowCentral', 'candyCaneShadowCentral', 0, 0);
shadow.width = 1420;
shadow.height = 256;
shadow.x = 300;
shadow.y = 2400;
self.addChild(shadow);
var resultText = new Text2(win ? 'Player 1 Wins' : 'Player 1 Boom', {
size: 200,
fill: '#FFFFFF'
});
resultText.anchor.set(0.5, 0);
resultText.x = 2048 / 2;
resultText.y = 2400;
self.addChild(resultText);
}
explosion.destroy();
isAnimatingEnd = false;
}, 3500);
}
function computeComputerCandiesCount(nbSticksLeft) {
var targetModulo = (nbSticksLeft - 1) % 4;
return targetModulo === 0 ? 1 : targetModulo;
}
function setSelectionPositions(self, refY) {
self.player.y = refY + 120;
self.computerPlayer.y = refY + computerArmOffset;
}
function removeCandies(candyCanes, count) {
if (debug) {
console.log('removeCandies... ' + count + " / playerTurn = " + playerTurn);
}
for (var i = 0; i < count; i++) {
if (candyCanes.length > 0) {
var candyToRemove = candyCanes.shift();
candyToRemove.destroy();
}
}
}
var Explosion = Container.expand(function () {
var self = Container.call(this);
var explosionGraphics = self.createAsset('explosion', 'Explosion Graphics', .5, .5);
self.x = 2048 / 2 + 30;
self.y = lastCandyY;
self.scale.set(0);
self.animate = function () {
var scaleDelta = 0.05;
var maxScale = 10;
var animationInterval = LK.setInterval(function () {
if (self.scale.x < maxScale) {
self.scale.x += scaleDelta;
self.scale.y += scaleDelta;
} else {
LK.clearInterval(animationInterval);
}
}, 1000 / 60);
};
});
var LastCandyCane = Container.expand(function () {
var self = Container.call(this);
var candyCaneGraphics = self.createAsset('lastCandyCane', 'Last Candy Cane', .5, .5);
addShadows(self, -350, 75, -255, -25);
});
var CandyCane = Container.expand(function () {
var self = Container.call(this);
var candyCaneGraphics = self.createAsset('candyCane', 'Candy Cane', .5, .5);
addShadows(self, -320, 120, -225, -10);
self.pick = function () {
self.parent.selectedCandiesCount++;
if (debug) {
console.log("Picked ", self);
}
};
});
var Player = Container.expand(function () {
var self = Container.call(this);
self.createAsset('player', 'Player', .5, .5);
self.alpha = 0;
self.pickCandyCane = function () {
self.computerPlayer.pickCandyCane();
self.alpha = 0;
};
});
var ComputerPlayer = Container.expand(function () {
if (debug) {
console.log("ComputerPlayer : playerMode=" + playerMode + +" => " + (playerMode === 2 ? 'secondPlayer' : 'computerPlayer'));
}
var self = Container.call(this);
self.pickCandyCane = function (candyCanes, callback) {
enlargeCadyCanes(candyCanes, 1);
LK.setTimeout(function () {
if (candyCanes.length === 0) {
return;
}
var candiesToPick = computeComputerCandiesCount(candyCanes.length);
var targetY = candyCanes.length > 0 && candyCanes.length >= candiesToPick ? candyCanes[candiesToPick - 1].y : 0;
targetY += computerArmOffset;
var screenHeight = LK.stageContainer.height;
var speedFactor = (screenHeight > 2732 ? 1 : 1.5) * (candiesToPick === 2 ? 2 : 1);
var deltaY = (targetY - self.y) / (60 / speedFactor);
var pickInterval = LK.setInterval(function () {
var currentCandyIndex = Math.abs(Math.floor((self.y - candyCanes[0].y) / (computerArmOffset * 2)));
var currentSelectionCount = Math.max(1, Math.min(3, currentCandyIndex + 1));
if (debug) {
console.log("current candy y=" + candyCanes[0].y + " / self y : " + self.y + " => index " + currentCandyIndex + " => " + currentSelectionCount);
}
enlargeCadyCanes(candyCanes, currentSelectionCount);
if (Math.abs(self.y - targetY) > Math.abs(deltaY)) {
self.y += deltaY;
} else {
self.y = targetY;
LK.clearInterval(pickInterval);
removeCandies(candyCanes, candiesToPick);
if (typeof callback === 'function') {
callback();
}
}
}, 1000 / 60);
}, 500);
};
self.createAsset(playerMode === 2 ? 'secondPlayer' : 'computerPlayer', 'Second Player', .5, .5);
self.alpha = 0;
self.update = function () {};
});
var PlayerModePopup = Container.expand(function (game) {
var self = Container.call(this);
self.createAsset('playerModePopup', 'Player Mode Popup', 0.5, 0.5);
self.x = 2048 / 2;
self.y = 2732 / 2;
var nbPlayersLabelText = new Text2('Players', {
size: 200,
fill: '#404D4B',
fontWeight: 'bold'
});
nbPlayersLabelText.anchor.set(0.5, 0.5);
nbPlayersLabelText.x = 0;
nbPlayersLabelText.y = -350;
self.addChild(nbPlayersLabelText);
var onePlayerButton = self.createAsset('onePlayerButton', 'One Player Button', 0.5, 0.5);
onePlayerButton.x = -300;
onePlayerButton.y = 140;
onePlayerButton.alpha = 1;
onePlayerButton.on('down', function () {
self.destroy();
game.initGame(1);
});
var twoPlayerButton = self.createAsset('twoPlayerButton', 'Two Player Button', 0.5, 0.5);
twoPlayerButton.x = 300;
twoPlayerButton.y = 140;
twoPlayerButton.alpha = 1;
twoPlayerButton.on('down', function () {
self.destroy();
game.initGame(2);
});
self.addChild(onePlayerButton);
self.addChild(twoPlayerButton);
;
var onePlayerText = new Text2('1', {
size: 256,
fill: '#404D4B',
fontWeight: 'bold'
});
onePlayerText.anchor.set(0.5, 0.5);
onePlayerText.x = onePlayerButton.x;
onePlayerText.y = onePlayerButton.y - 10;
self.addChild(onePlayerText);
var twoPlayerText = new Text2('2', {
size: 256,
fill: '#404D4B',
fontWeight: 'bold'
});
twoPlayerText.anchor.set(0.5, 0.5);
twoPlayerText.x = twoPlayerButton.x;
twoPlayerText.y = twoPlayerButton.y - 10;
self.addChild(twoPlayerText);
});
var Game = Container.expand(function () {
var self = Container.call(this);
var playerTurn = true;
var candyCanes = [];
self.selectedCandiesCount = 0;
self.computerCandiesCount = 0;
var background = self.createAsset('background', 'Game Background', 0.2545, 0.215);
self.addChildAt(background, 0);
if (debug) {
self.selectedCandiesText = new Text2("0", {
size: 100,
fill: "#00FF00"
});
self.selectedCandiesText.anchor.set(0, 0);
LK.gui.topLeft.addChild(self.selectedCandiesText);
self.computerCandiesText = new Text2("?", {
size: 100,
fill: "#FF0000"
});
self.computerCandiesText.anchor.set(1, 0);
LK.gui.topRight.addChild(self.computerCandiesText);
self.playerYPositionText = new Text2('', {
size: 100,
fill: "#00FF00"
});
self.playerYPositionText.anchor.set(-0, 1);
LK.gui.bottomLeft.addChild(self.playerYPositionText);
self.computerYPositionText = new Text2('', {
size: 100,
fill: "#00FF00"
});
self.computerYPositionText.anchor.set(1, 1);
LK.gui.bottomRight.addChild(self.computerYPositionText);
self.candyCaneYPositionText = new Text2('', {
size: 100,
fill: "#00FF00"
});
self.candyCaneYPositionText.anchor.set(0.5, 0);
LK.gui.topCenter.addChild(self.candyCaneYPositionText);
}
self.initGame = function (selectedPlayerMode) {
console.log("initGame... playerMode = " + selectedPlayerMode);
playerMode = selectedPlayerMode;
self.player = self.addChild(new Player());
self.player.x = 400;
self.player.y = 270 + 130;
self.computerPlayer = self.addChild(new ComputerPlayer());
self.computerPlayer.x = 1648;
self.computerPlayer.y = 1324;
candiesNumber = Math.floor(Math.random() * 3) + 10;
for (var i = 0; i < candiesNumber; i++) {
var candyCane = new CandyCane();
candyCane.x = 2048 / 2;
candyCane.y = 270 + i * 190;
candyCanes.push(candyCane);
self.addChild(candyCane);
}
var lastCandyCane = new LastCandyCane();
lastCandyCane.x = 2048 / 2 + 30;
lastCandyCane.y = 250 + candiesNumber * 190 + 20;
candyCanes.push(lastCandyCane);
self.addChild(lastCandyCane);
lastCandyY = lastCandyCane.y;
computerArmOffset = playerMode === 1 ? 120 : -60;
setSelectionPositions(self, candyCanes.length > 0 ? candyCanes[0].y : 0);
fade(self.player, 500, true);
gameState = 1;
};
stage.on('down', function (obj) {
if (gameState === 2 && !isAnimatingEnd) {
LK.showGameOver();
return;
}
if (gameState === 1) {
if (debug) {
console.log('Mouse down event:', obj);
}
if (playerMode == 1) {
if (playerTurn) {
playerSelecting = true;
stage.on('move', function (event) {
handleSelection(event, self.player, candyCanes);
if (debug) {
self.selectedCandiesText.setText(self.selectedCandiesCount.toString());
}
});
}
}
if (playerMode == 2) {
playerSelecting = true;
stage.on('move', function (event) {
handleSelection(event, playerTurn ? self.player : self.computerPlayer, candyCanes, !playerTurn);
if (debug) {
self.selectedCandiesText.setText(self.selectedCandiesCount.toString());
}
});
}
}
});
stage.on('up', function (obj) {
if (gameState === 1) {
if (debug) {
console.log('Mouse up event:', obj, playerTurn, playerSelecting, !self.selectedCandiesCount);
}
if (playerMode == 1) {
if (playerTurn && (!playerSelecting || !self.selectedCandiesCount)) {
if (debug) {
console.log('Nothing selected');
}
return;
}
if (!playerTurn) {
return;
}
playerSelecting = false;
stage.off('move', handleSelection);
removeCandies(candyCanes, self.selectedCandiesCount);
if (candyCanes.length === 0) {
handleGameEnd(self, false);
return;
}
self.selectedCandiesCount = 0;
if (debug) {
self.selectedCandiesText.setText("0");
}
setSelectionPositions(self, candyCanes.length > 0 ? candyCanes[0].y : 0);
playerTurn = false;
if (debug) {
console.log("Computer's turn");
}
fade(self.player, 500, false);
fade(self.computerPlayer, 500, true, function () {
self.computerPlayer.pickCandyCane(candyCanes, function () {
LK.setTimeout(function () {
fade(self.computerPlayer, 500, false, function () {
playerTurn = true;
if (debug) {
console.log("Human Player's turn");
}
if (candyCanes.length === 0) {
handleGameEnd(self, true);
return;
}
setSelectionPositions(self, candyCanes.length > 0 ? candyCanes[0].y : 0);
fade(self.player, 500, true);
self.computerCandiesCount = 0;
});
}, 1000);
});
});
}
if (playerMode == 2) {
if (!playerSelecting || !self.selectedCandiesCount) {
if (debug) {
console.log('Nothing selected');
}
return;
}
playerSelecting = false;
stage.off('move', handleSelection);
removeCandies(candyCanes, self.selectedCandiesCount);
if (candyCanes.length === 0) {
handleGameEnd(self, !playerTurn, playerMode);
return;
}
self.selectedCandiesCount = 0;
if (debug) {
self.selectedCandiesText.setText("0");
}
setSelectionPositions(self, candyCanes.length > 0 ? candyCanes[0].y : 0);
playerTurn = !playerTurn;
if (playerTurn) {
fade(self.player, 500, true);
fade(self.computerPlayer, 500, false);
} else {
fade(self.player, 500, false);
fade(self.computerPlayer, 500, true);
}
}
}
});
LK.on('tick', function () {
if (debug) {
if (self.player && self.playerYPositionText) {
self.playerYPositionText.setText('Py: ' + Math.round(self.player.y));
}
if (self.computerPlayer && self.computerYPositionText) {
self.computerYPositionText.setText('Ky: ' + Math.round(self.computerPlayer.y));
}
if (candyCanes.length > 0 && self.candyCaneYPositionText) {
self.candyCaneYPositionText.setText('Cy: ' + Math.round(candyCanes[0].y));
}
self.computerCandiesText.setText(self.computerCandiesCount ? self.computerCandiesCount.toString() : "?");
}
});
var playerModePopup = new PlayerModePopup(self);
self.addChild(playerModePopup);
});
a christmas wooden board Background image. High contrast. No shadows.
a vertical christmas wooden board with snow, and decorations on its sides Background image. High contrast. No shadows.
a photo-realistic white and red vertical candy stick slice Single Game Texture. No background. High contrast. No shadows.
a horizontal santa's arm with a white glove and the index pointing to the right Single Game Texture. No background. High contrast. No shadows.
an green hairy grinch's arm, pointing in the horizontal direction, the index finger pointing to the left Single Game Texture. No background. High contrast. No shadows.
a photo-realistic white and red twisted candy stick slice in vertical position and with an extinguished wick. At its center, a simple white rectangular "TNT" sticker in the same direction as the stick Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a top view of a TNT explosion fire Background image. High contrast. No shadows.
A funny Santa Claus disheveled and covered by black soot after an explosion. stary night. High contrast.
a futuristic white robot arm. horizontal direction. the index finger pointing to the left. Single Game Texture. No background. High contrast. No shadows.
A old super hero Santa Claus holding a candy cane in his hand High contrast.
frame of an empty christmas themed popup with a decorated border User interface
a single mat rounded empty button User interface