User prompt
Migrate to the latest version of LK
User prompt
increase te win lose animation to 2 seconds
Code edit (8 edits merged)
Please save this source code
User prompt
make the multiplier font size larger
Code edit (3 edits merged)
Please save this source code
User prompt
the score multiplier has a delay before becoming visible. add 100 to that value
Code edit (4 edits merged)
Please save this source code
User prompt
increase the multiplier delay by 100
User prompt
add a 100 miliseconds delay before making the score multiplier text visible, while keeping it invisible during the flipping animation. just that instead of instantly showing it when the coin lands, we add a delay
User prompt
add a 100 miliseconds delay before making the score multiplier text visible
Code edit (1 edits merged)
Please save this source code
/****
* Classes
****/
var HeadsAsset = Container.expand(function () {
var self = Container.call(this);
self.headsGraphics = self.attachAsset('heads', {
anchorX: 0.5,
anchorY: 0.5
});
self.headsGraphics.visible = true;
});
var TailsAsset = Container.expand(function () {
var self = Container.call(this);
self.tailsGraphics = self.attachAsset('tails', {
anchorX: 0.5,
anchorY: 0.5
});
self.tailsGraphics.visible = false;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
self.heads = new HeadsAsset();
self.tails = new TailsAsset();
self.addChild(self.heads);
self.addChild(self.tails);
self.currentSide = 'heads';
self.flipDuration = 10;
self.maxDuration = 220;
self.flipInterval = null;
self.flipTimeout = null;
self.flip = function (onFlipEnd) {
var flipCoin = function flipCoin() {
self.currentSide = self.currentSide === 'heads' ? 'tails' : 'heads';
self.heads.headsGraphics.visible = self.currentSide === 'heads';
self.tails.tailsGraphics.visible = self.currentSide === 'tails';
self.flipDuration *= 1.1;
if (self.flipDuration <= self.maxDuration) {
self.flipInterval = LK.setTimeout(flipCoin, self.flipDuration);
} else {
LK.clearTimeout(self.flipInterval);
self.flipTimeout = LK.setTimeout(function () {
var finalSide = Math.random() < 0.5 ? 'heads' : 'tails';
self.currentSide = finalSide;
self.heads.headsGraphics.visible = finalSide === 'heads';
self.tails.tailsGraphics.visible = finalSide === 'tails';
if (typeof onFlipEnd === 'function') {
onFlipEnd(finalSide === 'heads', finalSide);
}
self.flipDuration = 60;
game.enableButtons();
game.headsButton.visible = true;
game.tailsButton.visible = true;
game.coinFlipping = false;
game.multiplierDisplay.visible = true;
}, 440);
}
};
LK.clearTimeout(self.flipInterval);
LK.clearTimeout(self.flipTimeout);
self.flipDuration = 60;
flipCoin();
};
});
var ChoiceButton = Container.expand(function (assetId, description, isHeads) {
var self = Container.call(this);
self.isHeads = isHeads;
self.gameInstance = null;
var buttonGraphic = self.createAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.interactive = true;
self.buttonMode = true;
self.on('down', function () {
if (!self.gameInstance.coinFlipping) {
self.gameInstance.coinFlipping = true;
self.gameInstance.headsButton.visible = false;
self.gameInstance.tailsButton.visible = false;
self.gameInstance.resetBackground(); // Reset and animate background
if (self.gameInstance.feedbackAsset) {
self.gameInstance.feedbackAsset.destroy();
self.gameInstance.feedbackAsset = null;
}
self.gameInstance.coin.flip(function (flipResult, finalSide) {
var feedbackAssetId;
if (flipResult !== self.isHeads) {
game.lives -= 1;
game.updateLivesDisplay();
feedbackAssetId = 'UI_Loss';
if (game.lives <= 0) {
LK.effects.flashScreen(0xff0000, 1000);
game.multiplier = 1;
LK.showGameOver();
}
} else {
self.gameInstance.multiplier *= 2;
self.gameInstance.updateMultiplierDisplay();
feedbackAssetId = 'UI_Win';
}
LK.setTimeout(function () {
self.gameInstance.feedbackAsset = LK.getAsset(feedbackAssetId, {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 1.5
});
game.addChild(self.gameInstance.feedbackAsset);
}, 270);
LK.setTimeout(function () {
if (self.gameInstance.feedbackAsset) {
self.gameInstance.feedbackAsset.destroy();
self.gameInstance.feedbackAsset = null;
}
}, 1000);
});
self.gameInstance.disableButtons();
game.multiplierDisplay.visible = false;
}
});
});
var MultiplierDisplay = Container.expand(function () {
var self = Container.call(this);
self.multiplierText = new Text2('X 1', {
size: 150,
fill: "#ffffff",
align: 'center',
stroke: '#000000',
strokeThickness: 15
});
self.multiplierText.anchor.set(0.5, 0);
self.addChild(self.multiplierText);
self.multiplierText.x = 0;
self.multiplierText.y = 250;
self.updateMultiplier = function (multiplier) {
self.multiplierText.setText(multiplier.toString());
};
});
var LivesDisplay = Container.expand(function () {
var self = Container.call(this);
self.livesIcons = [];
for (var i = 0; i < 3; i++) {
var icon = self.attachAsset('lives', {
anchorX: 0.5,
anchorY: 0.5
});
icon.x = i * icon.width + i * 10;
self.livesIcons.push(icon);
}
self.updateLives = function (lives) {
for (var i = 0; i < self.livesIcons.length; i++) {
if (i < lives) {
self.livesIcons[i].tint = 0xFFFFFF; // Reset to white if life is available
} else {
self.livesIcons[i].tint = 0x000000; // Change to black if life is lost
}
}
};
self.y = 2732 / 20 - self.livesIcons[0].height / 10;
self.x = 2048 / 1.8 - ((self.livesIcons[0].width + 10) * self.livesIcons.length - 10) / 2; // Position the lives display at the middle of the screen
});
var Background = Container.expand(function () {
var self = Container.call(this);
self.shakeBackground = function () {
var shakeDuration = 5; // quarter of a second at 60FPS
var shakeAmount = 10; // shake by 10 pixels
var shakeInterval = null;
var shake = function shake() {
if (shakeDuration-- > 0) {
self.backgroundGraphics.x += (Math.random() - 0.5) * shakeAmount;
self.backgroundGraphics.y += (Math.random() - 0.5) * shakeAmount;
} else {
LK.clearInterval(shakeInterval);
self.backgroundGraphics.x = 2048 / 2;
self.backgroundGraphics.y = 2732 / 2; // Reset to original position
}
};
shakeInterval = LK.setInterval(shake, 1000 / 60);
};
self.backgroundGraphics = self.attachAsset('background', {
anchorX: 0.5,
anchorY: 0.5
});
self.backgroundGraphics.x = 2048 / 2;
self.backgroundGraphics.y = 2732 / 2; // Start centered on the screen
self.moveToCenter = function () {
var startY = self.backgroundGraphics.y;
var endY = startY - 2000;
var downDuration = 10; // 1 second at 60FPS
var upDuration = 130; // 1 second at 60FPS
var downStep = 2000 / downDuration;
var upStep = 2000 / upDuration;
var currentFrame = 0;
var moveBackgroundDown = function moveBackgroundDown() {
if (currentFrame < downDuration) {
self.backgroundGraphics.y += downStep;
currentFrame++;
} else {
LK.clearInterval(self.moveInterval);
currentFrame = 0;
self.moveInterval = LK.setInterval(moveBackgroundUp, 1000 / 60);
}
};
var moveBackgroundUp = function moveBackgroundUp() {
if (currentFrame < upDuration) {
self.backgroundGraphics.y -= upStep;
currentFrame++;
} else {
LK.clearInterval(self.moveInterval);
self.backgroundGraphics.y = startY;
self.shakeBackground();
}
};
self.moveInterval = LK.setInterval(moveBackgroundDown, 1000 / 60);
};
self.resetBackground = function () {
if (self.moveInterval) {
LK.clearInterval(self.moveInterval);
}
self.backgroundGraphics.destroy();
self.backgroundGraphics = self.attachAsset('background', {
anchorX: 0.5,
anchorY: 0.5
});
self.backgroundGraphics.x = 2048 / 2;
self.backgroundGraphics.y = 2732 / 2;
self.moveToCenter();
};
});
/****
* Initialize Game
****/
// Later in the code, after game initialization
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
game.resetBackground = function () {
if (game.backgroundInstance) {
game.backgroundInstance.resetBackground();
}
};
game.backgroundInstance = game.addChild(new Background());
// Later in the code, after game initialization
game.livesDisplayInstance = game.addChild(new LivesDisplay());
game.updateLivesDisplay = function () {
game.livesDisplayInstance.updateLives(game.lives);
};
game.multiplier = 1;
game.lives = 3; // Initialize the lives system with 3 lives
game.updateScoreDisplay = function () {
scoreDisplay.setText(game.score.toString());
};
game.multiplierDisplay = LK.gui.topCenter.addChild(new MultiplierDisplay());
game.updateMultiplierDisplay = function () {
game.multiplierDisplay.updateMultiplier(game.multiplier);
};
game.updateMultiplierDisplay();
game.setBackgroundColor(0x5cd3ff);
game.coinFlipping = false;
game.disableButtons = function () {
game.headsButton.interactive = false;
game.tailsButton.interactive = false;
};
game.enableButtons = function () {
game.headsButton.interactive = true;
game.tailsButton.interactive = true;
};
game.coin = game.addChild(new Coin());
game.coin.x = 2048 / 2;
game.coin.y = 2732 / 2 - 100;
game.coin.on('added', function () {
game.coin.x = 2048 / 2 - game.coin.width / 2;
game.coin.y = 2732 / 2 - game.coin.height / 2;
});
game.headsButton = game.addChild(new ChoiceButton('heads', 'Heads Button', true));
game.headsButton.gameInstance = game;
game.headsButton.isHeads = true;
game.tailsButton = game.addChild(new ChoiceButton('tails', 'Tails Button', false));
game.tailsButton.gameInstance = game;
game.tailsButton.isHeads = false;
game.tailsButton.x = 2048 * 3 / 4;
game.tailsButton.y = 2732 - game.tailsButton.height / 2 - 100;
game.headsButton.x = 2048 / 4;
game.headsButton.y = 2732 - game.headsButton.height / 2 - 100;
isometric silver coin with a pirate monkey face. pirate themed. pixelated. 8 bit. viewed from the top as if the coin is resting flat.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
clean isometric silver doubloon. pirate themed. pixelated. 8 bit. viewed from the top as if the coin is resting flat.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
isometric tiny mini pirate island that floats in the sky. an red painted X marks the spot located in the center of the map. pixelated. 8 bit.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
isometric doubloon copper coin icon featuring a skull. shaped like a heart. pirate themed. pixelated. 8 bit.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
text saying "Arghhh". pirate themes. pixelated. 8 bit.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
simple golden text saying "WIN". text is bursting out of the treasure chest with golden coins bursting behind the text. pirate themed banner. pixelated. 8 bit.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.