Code edit (6 edits merged)
Please save this source code
User prompt
make the one and two PlayerText bold
Code edit (18 edits merged)
Please save this source code
Code edit (4 edits merged)
Please save this source code
User prompt
When In 2 players mode computer is controlled by mouse y like for the player
User prompt
fix event up and down only work for 1 player
User prompt
fix turn is not changing
User prompt
fix computer doesn't play in 1 player mode
Code edit (1 edits merged)
Please save this source code
User prompt
current code of up and down events is for 1 player mode, add the tests playerMode === 1
Code edit (1 edits merged)
Please save this source code
User prompt
log all the steps required to implement up & down events in 2 player mode
User prompt
in 2 players mode, hide player when it's the 2nd player turn
Code edit (2 edits merged)
Please save this source code
User prompt
in 2 players mode, add a big label in the bottom quarter : "Player 1 Wins" if win, else "Player 1 Boom"
Code edit (3 edits merged)
Please save this source code
User prompt
Fix Bug: 'Uncaught ReferenceError: win is not defined' in this line: 'handleGameEnd(self, win, 2);' Line Number: 450
User prompt
Fix Bug: 'Uncaught ReferenceError: win is not defined' in this line: 'handleGameEnd(self, win, 2);' Line Number: 450
Code edit (4 edits merged)
Please save this source code
User prompt
add a background color to resultText
Code edit (4 edits merged)
Please save this source code
User prompt
Add a global variable lastCandyY = 270 + 12 * 190; at the beginning
User prompt
Add lastCandyY = lastCandyCane.y in initGame
User prompt
Use lastCandyY instead of 250 + 12 * 190 + 20 in Explosion class
User prompt
in computer player class create asset named 'computerPlayer' in 1 player mode and 'secondPlayer' in 2 players mode. Don’t change anything else
var gameState = 0;
var candiesNumber = 11;
var isAnimatingEnd = false;
var playerTurn = true;
var playerSelecting = false;
var computerArmOffset = 120;
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) {
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;
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);
}
function handleGameEnd(self, win) {
if (debug) {
console.log("handleGameEnd...win = " + win);
}
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);
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 = 250 + 12 * 190 + 20;
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 () {
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('computerPlayer', 'Computer Player', .5, .5);
self.alpha = 0;
self.update = function () {};
});
var PlayerModePopup = Container.expand(function () {
var self = Container.call(this);
self.createAsset('playerModePopup', 'Player Mode Popup', 0.5, 0.5);
self.x = 2048 / 2;
self.y = 2732 / 2;
var onePlayerButton = self.createAsset('onePlayerButton', 'One Player Button', 0.5, 0.5);
onePlayerButton.x = -300;
onePlayerButton.y = 0;
onePlayerButton.alpha = 1;
onePlayerButton.on('down', function () {
self.destroy();
gameState = 1;
startGame(1);
});
var twoPlayerButton = self.createAsset('twoPlayerButton', 'Two Player Button', 0.5, 0.5);
twoPlayerButton.x = 300;
twoPlayerButton.y = 0;
twoPlayerButton.alpha = 1;
twoPlayerButton.on('down', function () {
self.destroy();
gameState = 1;
startGame(2);
});
self.addChild(onePlayerButton);
self.addChild(twoPlayerButton);
;
var onePlayerText = new Text2('1', {
size: 200,
fill: '#404D4B'
});
onePlayerText.anchor.set(0.5, 0.5);
onePlayerText.x = onePlayerButton.x;
onePlayerText.y = onePlayerButton.y - 20;
self.addChild(onePlayerText);
var twoPlayerText = new Text2('2', {
size: 200,
fill: '#404D4B'
});
twoPlayerText.anchor.set(0.5, 0.5);
twoPlayerText.x = twoPlayerButton.x;
twoPlayerText.y = twoPlayerButton.y - 20;
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.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;
setSelectionPositions(self, candyCanes.length > 0 ? candyCanes[0].y : 0);
stage.on('down', function (obj) {
if (gameState === 2 && !isAnimatingEnd) {
LK.showGameOver();
return;
}
if (gameState === 1) {
if (debug) {
console.log('Mouse down event:', obj);
}
if (playerTurn) {
playerSelecting = true;
stage.on('move', function (event) {
handleSelection(event, self.player, candyCanes);
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 (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);
});
});
}
});
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() : "?");
}
});
function startGame(playerMode) {
fade(self.player, 500, true);
gameState = 1;
self.playerMode = playerMode;
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);
}
var playerModePopup = new PlayerModePopup();
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