Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
User prompt
Change color of pull trigger to light grey
User prompt
Please fix the bug: 'undefined is not an object (evaluating 'instructionsTxt.setText("Select a chamber or spin!").setStyle')' in or related to this line: 'instructionsTxt.setText("Select a chamber or spin!").setStyle({' Line Number: 439
User prompt
The press trigger is not clear and when you choose a chamber make the text bigger and make it simpler to understand
User prompt
Games a bit buggy, make it fr spin, make the text color better and make the choose the chamber system better
User prompt
Please fix the bug: 'TypeError: undefined is not an object (evaluating 'pullTriggerBtn.style.fill = "#550000"')' in or related to this line: 'pullTriggerBtn.style.fill = "#550000";' Line Number: 571
User prompt
Please fix the bug: 'undefined is not an object (evaluating 'timerText.style.fill = "#ffffff"')' in or related to this line: 'timerText.style.fill = "#ffffff";' Line Number: 276
Code edit (1 edits merged)
Please save this source code
User prompt
Nerve Rush Roulette
Initial prompt
Make a Russian roullet game with levels
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0, currentLevel: 1 }); /**** * Classes ****/ var BulletIndicator = Container.expand(function () { var self = Container.call(this); var bulletShape = self.attachAsset('bulletIndicator', { anchorX: 0.5, anchorY: 0.5 }); self.setActive = function (active) { bulletShape.alpha = active ? 1 : 0.3; }; return self; }); var Chamber = Container.expand(function () { var self = Container.call(this); // Chamber properties self.loaded = false; self.selected = false; self.angle = 0; // Chamber visuals var chamberBg = self.attachAsset('chamber', { anchorX: 0.5, anchorY: 0.5 }); var chamberHole = self.attachAsset('chamberHole', { anchorX: 0.5, anchorY: 0.5 }); self.setLoaded = function (isLoaded) { self.loaded = isLoaded; // Only show the red bullet indicator if revealed if (self.revealed && isLoaded) { chamberHole.destroy(); chamberHole = self.attachAsset('chamberLoaded', { anchorX: 0.5, anchorY: 0.5 }); } }; self.setRevealed = function (isRevealed) { self.revealed = isRevealed; if (isRevealed && self.loaded) { chamberHole.destroy(); chamberHole = self.attachAsset('chamberLoaded', { anchorX: 0.5, anchorY: 0.5 }); } }; self.setSelected = function (isSelected) { self.selected = isSelected; if (isSelected) { tween(chamberBg, { alpha: 0.7 }, { duration: 200 }); LK.getSound('click').play(); // Play sound when chamber is selected } else { tween(chamberBg, { alpha: 1 }, { duration: 200 }); } }; self.setAngle = function (newAngle) { self.angle = newAngle; }; self.down = function (x, y, obj) { if (!gameActive || spinningCylinder) { return; } self.setSelected(true); selectedChamber = self; }; return self; }); var Gun = Container.expand(function () { var self = Container.call(this); // Gun body var gunBody = self.attachAsset('gun', { anchorX: 0.5, anchorY: 0.5 }); // Gun handle var gunHandle = self.attachAsset('gunHandle', { anchorX: 0.5, anchorY: 0, y: 150 }); // Cylinder var cylinder = self.attachAsset('cylinder', { anchorX: 0.5, anchorY: 0.5, x: 50, y: -50 }); // Create chambers self.chambers = []; self.setupLevel = function (level) { // Clear existing chambers for (var i = 0; i < self.chambers.length; i++) { self.chambers[i].destroy(); } self.chambers = []; // Number of chambers based on level var chamberCount = 6; if (level > 5) { chamberCount = 8; } if (level > 10) { chamberCount = 10; } // Number of bullets based on level var bulletCount = Math.min(Math.floor(level / 2) + 1, chamberCount - 1); // Create chambers for (var i = 0; i < chamberCount; i++) { var chamber = new Chamber(); var angle = i / chamberCount * Math.PI * 2; var radius = 180; chamber.x = Math.cos(angle) * radius + 50; chamber.y = Math.sin(angle) * radius - 50; chamber.setAngle(angle); self.chambers.push(chamber); self.addChild(chamber); } // Randomly load chambers var loadedIndexes = []; while (loadedIndexes.length < bulletCount) { var randomIndex = Math.floor(Math.random() * chamberCount); if (loadedIndexes.indexOf(randomIndex) === -1) { loadedIndexes.push(randomIndex); } } for (var i = 0; i < loadedIndexes.length; i++) { self.chambers[loadedIndexes[i]].setLoaded(true); } return { chamberCount: chamberCount, bulletCount: bulletCount }; }; self.spinCylinder = function (callback) { var spinDuration = 1500; LK.getSound('spin').play(); // Add visual effect for spinning tween(cylinder, { scaleX: 1.1, scaleY: 1.1 }, { duration: 200, yoyo: true, repeat: 3 }); // Spin animation var rotations = 3 + Math.random() * 2; var startRotation = cylinder.rotation; var endRotation = startRotation + rotations * Math.PI * 2; tween(cylinder, { rotation: endRotation }, { duration: spinDuration, easing: tween.easeOutQuad, onFinish: function onFinish() { if (callback) { callback(); } } }); // Reorder the chambers randomly var newOrder = []; for (var i = 0; i < self.chambers.length; i++) { newOrder.push(i); } // Fisher-Yates shuffle for (var i = newOrder.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = newOrder[i]; newOrder[i] = newOrder[j]; newOrder[j] = temp; } // Store the chamber properties var loadedStates = []; for (var i = 0; i < self.chambers.length; i++) { loadedStates.push({ loaded: self.chambers[i].loaded, revealed: self.chambers[i].revealed }); } // Apply new order for (var i = 0; i < self.chambers.length; i++) { self.chambers[i].setLoaded(loadedStates[newOrder[i]].loaded); self.chambers[i].setRevealed(loadedStates[newOrder[i]].revealed); } }; return self; }); var LevelDisplay = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('levelIndicator', { anchorX: 0.5, anchorY: 0.5 }); var levelText = new Text2("Level 1", { size: 40, fill: 0xFFFFFF }); levelText.anchor.set(0.5, 0.5); self.addChild(levelText); self.updateLevel = function (level) { levelText.setText("Level " + level); }; return self; }); var Timer = Container.expand(function () { var self = Container.call(this); var timerText = new Text2("", { size: 50, fill: 0xFFFFFF }); timerText.anchor.set(0.5, 0.5); self.addChild(timerText); self.timeRemaining = 0; self.active = false; self.timerInterval = null; self.startTimer = function (seconds) { self.timeRemaining = seconds; self.active = true; self.updateDisplay(); if (self.timerInterval) { LK.clearInterval(self.timerInterval); } self.timerInterval = LK.setInterval(function () { if (self.active) { self.timeRemaining -= 0.1; if (self.timeRemaining <= 0) { self.timeRemaining = 0; self.active = false; if (self.onTimeUp) { self.onTimeUp(); } } self.updateDisplay(); } }, 100); }; self.stopTimer = function () { self.active = false; if (self.timerInterval) { LK.clearInterval(self.timerInterval); self.timerInterval = null; } }; self.updateDisplay = function () { timerText.setText(Math.ceil(self.timeRemaining).toString()); // Change color based on time remaining if (self.timeRemaining <= 5) { timerText.setStyle({ fill: 0xFF3333 //{20} // Slightly lighter red for better visibility }); } else if (self.timeRemaining <= 10) { timerText.setStyle({ fill: 0xFFCC33 //{23} // Brighter orange for better visibility }); } else { timerText.setStyle({ fill: 0xDDDDDD //{27} // Softer white for better contrast }); } }; self.onTimeUp = null; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000022 }); /**** * Game Code ****/ // Game state variables var currentLevel = storage.currentLevel || 1; var score = 0; var highScore = storage.highScore || 0; var gameActive = false; var spinningCylinder = false; var selectedChamber = null; var levelData = null; var timePerTurn = 0; var remainingEmptyChambers = 0; // Game elements var gun = new Gun(); var levelDisplay = new LevelDisplay(); var timer = new Timer(); var bulletIndicators = []; // Score display var scoreTxt = new Text2("Score: 0", { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); // High score display var highScoreTxt = new Text2("High Score: " + highScore, { size: 40, fill: 0xFFAA00 }); highScoreTxt.anchor.set(0.5, 0); // Game message text var messageTxt = new Text2("", { size: 70, fill: 0xFFFFFF }); messageTxt.anchor.set(0.5, 0.5); // Instructions text var instructionsTxt = new Text2("", { size: 50, fill: 0xFFFFFF }); instructionsTxt.anchor.set(0.5, 0); // "Pull Trigger" button var pullTriggerBtn = new Text2("PULL TRIGGER", { size: 80, fill: 0xFFFFFF }); pullTriggerBtn.anchor.set(0.5, 0.5); pullTriggerBtn.interactive = true; // "Spin" button var spinBtn = new Text2("SPIN CYLINDER", { size: 60, fill: 0xFFFFFF }); spinBtn.anchor.set(0.5, 0.5); spinBtn.interactive = true; function setupGame() { // Add game elements game.addChild(gun); gun.x = 2048 / 2; gun.y = 2732 / 2 - 200; // Add level display game.addChild(levelDisplay); levelDisplay.x = 2048 / 2; levelDisplay.y = 150; // Add timer game.addChild(timer); timer.x = 2048 / 2; timer.y = 250; // Add score text LK.gui.top.addChild(scoreTxt); scoreTxt.y = 20; // Add high score text LK.gui.top.addChild(highScoreTxt); highScoreTxt.y = 90; // Add message text game.addChild(messageTxt); messageTxt.x = 2048 / 2; messageTxt.y = 2732 / 2 - 600; // Add instructions text game.addChild(instructionsTxt); instructionsTxt.x = 2048 / 2; instructionsTxt.y = 2732 - 200; // Add pull trigger button game.addChild(pullTriggerBtn); pullTriggerBtn.x = 2048 / 2; pullTriggerBtn.y = 2732 - 350; // Add spin button game.addChild(spinBtn); spinBtn.x = 2048 / 2; spinBtn.y = 2732 - 450; // Button events pullTriggerBtn.down = onPullTrigger; spinBtn.down = onSpinCylinder; // Timer event timer.onTimeUp = function () { if (gameActive) { showMessage("Time's up!"); LK.setTimeout(function () { endGame(); }, 1500); } }; // Start level startLevel(currentLevel); // Play background music LK.playMusic('tensionMusic', { loop: true }); } function startLevel(level) { // Reset state gameActive = true; spinningCylinder = false; selectedChamber = null; currentLevel = level; // Update level display levelDisplay.updateLevel(level); // Set up gun with current level difficulty levelData = gun.setupLevel(level); // Calculate time per turn based on level timePerTurn = Math.max(30 - level * 1.5, 10); // Set remaining empty chambers remainingEmptyChambers = levelData.chamberCount - levelData.bulletCount; // Create bullet indicators createBulletIndicators(levelData.bulletCount); // Update score display updateScoreDisplay(); // Update instructions instructionsTxt.setText("Select a chamber or spin!"); instructionsTxt.setStyle({ size: 60 }); // Show level start message showMessage("Level " + level + " - " + levelData.bulletCount + " bullet" + (levelData.bulletCount > 1 ? "s" : "")); // Start timer timer.startTimer(timePerTurn); // Save current level storage.currentLevel = currentLevel; } function createBulletIndicators(bulletCount) { // Remove existing indicators for (var i = 0; i < bulletIndicators.length; i++) { bulletIndicators[i].destroy(); } bulletIndicators = []; // Create new indicators var spacing = 50; var totalWidth = (bulletCount - 1) * spacing; var startX = 2048 / 2 - totalWidth / 2; for (var i = 0; i < bulletCount; i++) { var indicator = new BulletIndicator(); indicator.x = startX + i * spacing; indicator.y = 350; indicator.setActive(true); game.addChild(indicator); bulletIndicators.push(indicator); } } function onSpinCylinder() { if (!gameActive || spinningCylinder) { return; } spinningCylinder = true; instructionsTxt.setText("Spinning..."); // Reset selection if (selectedChamber) { selectedChamber.setSelected(false); selectedChamber = null; } gun.spinCylinder(function () { spinningCylinder = false; instructionsTxt.setText("Choose a chamber!"); // Reset timer for this turn timer.startTimer(timePerTurn); }); } function onPullTrigger() { if (!gameActive || spinningCylinder || !selectedChamber) { return; } gameActive = false; // Temporarily disable game while animation plays // Reveal the chamber selectedChamber.setRevealed(true); LK.setTimeout(function () { if (selectedChamber.loaded) { // Chamber was loaded - game over LK.getSound('bang').play(); // Flash screen red LK.effects.flashScreen(0xff0000, 1000); showMessage("BANG! Game Over!"); // Update bullet indicator updateBulletIndicator(); LK.setTimeout(function () { endGame(); }, 2000); } else { // Chamber was empty - continue game LK.getSound('click').play(); // Disable the selected chamber selectedChamber.setSelected(false); selectedChamber.alpha = 0.3; selectedChamber.interactive = false; // Update score score += currentLevel * 10; updateScoreDisplay(); // Update remaining empty chambers remainingEmptyChambers--; // Check if level completed if (remainingEmptyChambers <= 0) { LK.getSound('win').play(); showMessage("Level Complete!"); LK.setTimeout(function () { startLevel(currentLevel + 1); }, 2000); } else { // Reset for next turn selectedChamber = null; gameActive = true; // Reset timer for this turn timer.startTimer(timePerTurn); // Update instructions instructionsTxt.setText("Choose another chamber!"); } } }, 1000); } function updateBulletIndicator() { // Find the first active indicator and deactivate it for (var i = 0; i < bulletIndicators.length; i++) { if (bulletIndicators[i].alpha === 1) { bulletIndicators[i].setActive(false); break; } } } function showMessage(text) { messageTxt.setText(text); messageTxt.alpha = 1; // Fade out after 2 seconds LK.setTimeout(function () { tween(messageTxt, { alpha: 0 }, { duration: 500 }); }, 2000); } function updateScoreDisplay() { scoreTxt.setText("Score: " + score); // Update high score if needed if (score > highScore) { highScore = score; storage.highScore = highScore; highScoreTxt.setText("High Score: " + highScore); } } function endGame() { // Game over logic LK.showGameOver(); // Reset variables for next game currentLevel = 1; score = 0; gameActive = false; } // Game update function game.update = function () { // This function is called every frame (60 times per second) // Pulse effect for the pull trigger button if (gameActive && selectedChamber) { pullTriggerBtn.alpha = 0.7 + Math.sin(LK.ticks / 10) * 0.3; pullTriggerBtn.setStyle({ fill: 0xff0000, size: 100 }); } else { pullTriggerBtn.alpha = 0.5; pullTriggerBtn.setStyle({ fill: 0xD3D3D3, size: 100 }); } // Spin button visibility if (gameActive && !spinningCylinder) { spinBtn.alpha = 1; } else { spinBtn.alpha = 0.5; } }; // Mouse or touch events game.down = function (x, y, obj) { // Handle global down events }; game.up = function (x, y, obj) { // Handle global up events }; // Initialize the game setupGame();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0,
currentLevel: 1
});
/****
* Classes
****/
var BulletIndicator = Container.expand(function () {
var self = Container.call(this);
var bulletShape = self.attachAsset('bulletIndicator', {
anchorX: 0.5,
anchorY: 0.5
});
self.setActive = function (active) {
bulletShape.alpha = active ? 1 : 0.3;
};
return self;
});
var Chamber = Container.expand(function () {
var self = Container.call(this);
// Chamber properties
self.loaded = false;
self.selected = false;
self.angle = 0;
// Chamber visuals
var chamberBg = self.attachAsset('chamber', {
anchorX: 0.5,
anchorY: 0.5
});
var chamberHole = self.attachAsset('chamberHole', {
anchorX: 0.5,
anchorY: 0.5
});
self.setLoaded = function (isLoaded) {
self.loaded = isLoaded;
// Only show the red bullet indicator if revealed
if (self.revealed && isLoaded) {
chamberHole.destroy();
chamberHole = self.attachAsset('chamberLoaded', {
anchorX: 0.5,
anchorY: 0.5
});
}
};
self.setRevealed = function (isRevealed) {
self.revealed = isRevealed;
if (isRevealed && self.loaded) {
chamberHole.destroy();
chamberHole = self.attachAsset('chamberLoaded', {
anchorX: 0.5,
anchorY: 0.5
});
}
};
self.setSelected = function (isSelected) {
self.selected = isSelected;
if (isSelected) {
tween(chamberBg, {
alpha: 0.7
}, {
duration: 200
});
LK.getSound('click').play(); // Play sound when chamber is selected
} else {
tween(chamberBg, {
alpha: 1
}, {
duration: 200
});
}
};
self.setAngle = function (newAngle) {
self.angle = newAngle;
};
self.down = function (x, y, obj) {
if (!gameActive || spinningCylinder) {
return;
}
self.setSelected(true);
selectedChamber = self;
};
return self;
});
var Gun = Container.expand(function () {
var self = Container.call(this);
// Gun body
var gunBody = self.attachAsset('gun', {
anchorX: 0.5,
anchorY: 0.5
});
// Gun handle
var gunHandle = self.attachAsset('gunHandle', {
anchorX: 0.5,
anchorY: 0,
y: 150
});
// Cylinder
var cylinder = self.attachAsset('cylinder', {
anchorX: 0.5,
anchorY: 0.5,
x: 50,
y: -50
});
// Create chambers
self.chambers = [];
self.setupLevel = function (level) {
// Clear existing chambers
for (var i = 0; i < self.chambers.length; i++) {
self.chambers[i].destroy();
}
self.chambers = [];
// Number of chambers based on level
var chamberCount = 6;
if (level > 5) {
chamberCount = 8;
}
if (level > 10) {
chamberCount = 10;
}
// Number of bullets based on level
var bulletCount = Math.min(Math.floor(level / 2) + 1, chamberCount - 1);
// Create chambers
for (var i = 0; i < chamberCount; i++) {
var chamber = new Chamber();
var angle = i / chamberCount * Math.PI * 2;
var radius = 180;
chamber.x = Math.cos(angle) * radius + 50;
chamber.y = Math.sin(angle) * radius - 50;
chamber.setAngle(angle);
self.chambers.push(chamber);
self.addChild(chamber);
}
// Randomly load chambers
var loadedIndexes = [];
while (loadedIndexes.length < bulletCount) {
var randomIndex = Math.floor(Math.random() * chamberCount);
if (loadedIndexes.indexOf(randomIndex) === -1) {
loadedIndexes.push(randomIndex);
}
}
for (var i = 0; i < loadedIndexes.length; i++) {
self.chambers[loadedIndexes[i]].setLoaded(true);
}
return {
chamberCount: chamberCount,
bulletCount: bulletCount
};
};
self.spinCylinder = function (callback) {
var spinDuration = 1500;
LK.getSound('spin').play();
// Add visual effect for spinning
tween(cylinder, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 200,
yoyo: true,
repeat: 3
});
// Spin animation
var rotations = 3 + Math.random() * 2;
var startRotation = cylinder.rotation;
var endRotation = startRotation + rotations * Math.PI * 2;
tween(cylinder, {
rotation: endRotation
}, {
duration: spinDuration,
easing: tween.easeOutQuad,
onFinish: function onFinish() {
if (callback) {
callback();
}
}
});
// Reorder the chambers randomly
var newOrder = [];
for (var i = 0; i < self.chambers.length; i++) {
newOrder.push(i);
}
// Fisher-Yates shuffle
for (var i = newOrder.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = newOrder[i];
newOrder[i] = newOrder[j];
newOrder[j] = temp;
}
// Store the chamber properties
var loadedStates = [];
for (var i = 0; i < self.chambers.length; i++) {
loadedStates.push({
loaded: self.chambers[i].loaded,
revealed: self.chambers[i].revealed
});
}
// Apply new order
for (var i = 0; i < self.chambers.length; i++) {
self.chambers[i].setLoaded(loadedStates[newOrder[i]].loaded);
self.chambers[i].setRevealed(loadedStates[newOrder[i]].revealed);
}
};
return self;
});
var LevelDisplay = Container.expand(function () {
var self = Container.call(this);
var bg = self.attachAsset('levelIndicator', {
anchorX: 0.5,
anchorY: 0.5
});
var levelText = new Text2("Level 1", {
size: 40,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0.5);
self.addChild(levelText);
self.updateLevel = function (level) {
levelText.setText("Level " + level);
};
return self;
});
var Timer = Container.expand(function () {
var self = Container.call(this);
var timerText = new Text2("", {
size: 50,
fill: 0xFFFFFF
});
timerText.anchor.set(0.5, 0.5);
self.addChild(timerText);
self.timeRemaining = 0;
self.active = false;
self.timerInterval = null;
self.startTimer = function (seconds) {
self.timeRemaining = seconds;
self.active = true;
self.updateDisplay();
if (self.timerInterval) {
LK.clearInterval(self.timerInterval);
}
self.timerInterval = LK.setInterval(function () {
if (self.active) {
self.timeRemaining -= 0.1;
if (self.timeRemaining <= 0) {
self.timeRemaining = 0;
self.active = false;
if (self.onTimeUp) {
self.onTimeUp();
}
}
self.updateDisplay();
}
}, 100);
};
self.stopTimer = function () {
self.active = false;
if (self.timerInterval) {
LK.clearInterval(self.timerInterval);
self.timerInterval = null;
}
};
self.updateDisplay = function () {
timerText.setText(Math.ceil(self.timeRemaining).toString());
// Change color based on time remaining
if (self.timeRemaining <= 5) {
timerText.setStyle({
fill: 0xFF3333 //{20} // Slightly lighter red for better visibility
});
} else if (self.timeRemaining <= 10) {
timerText.setStyle({
fill: 0xFFCC33 //{23} // Brighter orange for better visibility
});
} else {
timerText.setStyle({
fill: 0xDDDDDD //{27} // Softer white for better contrast
});
}
};
self.onTimeUp = null;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000022
});
/****
* Game Code
****/
// Game state variables
var currentLevel = storage.currentLevel || 1;
var score = 0;
var highScore = storage.highScore || 0;
var gameActive = false;
var spinningCylinder = false;
var selectedChamber = null;
var levelData = null;
var timePerTurn = 0;
var remainingEmptyChambers = 0;
// Game elements
var gun = new Gun();
var levelDisplay = new LevelDisplay();
var timer = new Timer();
var bulletIndicators = [];
// Score display
var scoreTxt = new Text2("Score: 0", {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
// High score display
var highScoreTxt = new Text2("High Score: " + highScore, {
size: 40,
fill: 0xFFAA00
});
highScoreTxt.anchor.set(0.5, 0);
// Game message text
var messageTxt = new Text2("", {
size: 70,
fill: 0xFFFFFF
});
messageTxt.anchor.set(0.5, 0.5);
// Instructions text
var instructionsTxt = new Text2("", {
size: 50,
fill: 0xFFFFFF
});
instructionsTxt.anchor.set(0.5, 0);
// "Pull Trigger" button
var pullTriggerBtn = new Text2("PULL TRIGGER", {
size: 80,
fill: 0xFFFFFF
});
pullTriggerBtn.anchor.set(0.5, 0.5);
pullTriggerBtn.interactive = true;
// "Spin" button
var spinBtn = new Text2("SPIN CYLINDER", {
size: 60,
fill: 0xFFFFFF
});
spinBtn.anchor.set(0.5, 0.5);
spinBtn.interactive = true;
function setupGame() {
// Add game elements
game.addChild(gun);
gun.x = 2048 / 2;
gun.y = 2732 / 2 - 200;
// Add level display
game.addChild(levelDisplay);
levelDisplay.x = 2048 / 2;
levelDisplay.y = 150;
// Add timer
game.addChild(timer);
timer.x = 2048 / 2;
timer.y = 250;
// Add score text
LK.gui.top.addChild(scoreTxt);
scoreTxt.y = 20;
// Add high score text
LK.gui.top.addChild(highScoreTxt);
highScoreTxt.y = 90;
// Add message text
game.addChild(messageTxt);
messageTxt.x = 2048 / 2;
messageTxt.y = 2732 / 2 - 600;
// Add instructions text
game.addChild(instructionsTxt);
instructionsTxt.x = 2048 / 2;
instructionsTxt.y = 2732 - 200;
// Add pull trigger button
game.addChild(pullTriggerBtn);
pullTriggerBtn.x = 2048 / 2;
pullTriggerBtn.y = 2732 - 350;
// Add spin button
game.addChild(spinBtn);
spinBtn.x = 2048 / 2;
spinBtn.y = 2732 - 450;
// Button events
pullTriggerBtn.down = onPullTrigger;
spinBtn.down = onSpinCylinder;
// Timer event
timer.onTimeUp = function () {
if (gameActive) {
showMessage("Time's up!");
LK.setTimeout(function () {
endGame();
}, 1500);
}
};
// Start level
startLevel(currentLevel);
// Play background music
LK.playMusic('tensionMusic', {
loop: true
});
}
function startLevel(level) {
// Reset state
gameActive = true;
spinningCylinder = false;
selectedChamber = null;
currentLevel = level;
// Update level display
levelDisplay.updateLevel(level);
// Set up gun with current level difficulty
levelData = gun.setupLevel(level);
// Calculate time per turn based on level
timePerTurn = Math.max(30 - level * 1.5, 10);
// Set remaining empty chambers
remainingEmptyChambers = levelData.chamberCount - levelData.bulletCount;
// Create bullet indicators
createBulletIndicators(levelData.bulletCount);
// Update score display
updateScoreDisplay();
// Update instructions
instructionsTxt.setText("Select a chamber or spin!");
instructionsTxt.setStyle({
size: 60
});
// Show level start message
showMessage("Level " + level + " - " + levelData.bulletCount + " bullet" + (levelData.bulletCount > 1 ? "s" : ""));
// Start timer
timer.startTimer(timePerTurn);
// Save current level
storage.currentLevel = currentLevel;
}
function createBulletIndicators(bulletCount) {
// Remove existing indicators
for (var i = 0; i < bulletIndicators.length; i++) {
bulletIndicators[i].destroy();
}
bulletIndicators = [];
// Create new indicators
var spacing = 50;
var totalWidth = (bulletCount - 1) * spacing;
var startX = 2048 / 2 - totalWidth / 2;
for (var i = 0; i < bulletCount; i++) {
var indicator = new BulletIndicator();
indicator.x = startX + i * spacing;
indicator.y = 350;
indicator.setActive(true);
game.addChild(indicator);
bulletIndicators.push(indicator);
}
}
function onSpinCylinder() {
if (!gameActive || spinningCylinder) {
return;
}
spinningCylinder = true;
instructionsTxt.setText("Spinning...");
// Reset selection
if (selectedChamber) {
selectedChamber.setSelected(false);
selectedChamber = null;
}
gun.spinCylinder(function () {
spinningCylinder = false;
instructionsTxt.setText("Choose a chamber!");
// Reset timer for this turn
timer.startTimer(timePerTurn);
});
}
function onPullTrigger() {
if (!gameActive || spinningCylinder || !selectedChamber) {
return;
}
gameActive = false; // Temporarily disable game while animation plays
// Reveal the chamber
selectedChamber.setRevealed(true);
LK.setTimeout(function () {
if (selectedChamber.loaded) {
// Chamber was loaded - game over
LK.getSound('bang').play();
// Flash screen red
LK.effects.flashScreen(0xff0000, 1000);
showMessage("BANG! Game Over!");
// Update bullet indicator
updateBulletIndicator();
LK.setTimeout(function () {
endGame();
}, 2000);
} else {
// Chamber was empty - continue game
LK.getSound('click').play();
// Disable the selected chamber
selectedChamber.setSelected(false);
selectedChamber.alpha = 0.3;
selectedChamber.interactive = false;
// Update score
score += currentLevel * 10;
updateScoreDisplay();
// Update remaining empty chambers
remainingEmptyChambers--;
// Check if level completed
if (remainingEmptyChambers <= 0) {
LK.getSound('win').play();
showMessage("Level Complete!");
LK.setTimeout(function () {
startLevel(currentLevel + 1);
}, 2000);
} else {
// Reset for next turn
selectedChamber = null;
gameActive = true;
// Reset timer for this turn
timer.startTimer(timePerTurn);
// Update instructions
instructionsTxt.setText("Choose another chamber!");
}
}
}, 1000);
}
function updateBulletIndicator() {
// Find the first active indicator and deactivate it
for (var i = 0; i < bulletIndicators.length; i++) {
if (bulletIndicators[i].alpha === 1) {
bulletIndicators[i].setActive(false);
break;
}
}
}
function showMessage(text) {
messageTxt.setText(text);
messageTxt.alpha = 1;
// Fade out after 2 seconds
LK.setTimeout(function () {
tween(messageTxt, {
alpha: 0
}, {
duration: 500
});
}, 2000);
}
function updateScoreDisplay() {
scoreTxt.setText("Score: " + score);
// Update high score if needed
if (score > highScore) {
highScore = score;
storage.highScore = highScore;
highScoreTxt.setText("High Score: " + highScore);
}
}
function endGame() {
// Game over logic
LK.showGameOver();
// Reset variables for next game
currentLevel = 1;
score = 0;
gameActive = false;
}
// Game update function
game.update = function () {
// This function is called every frame (60 times per second)
// Pulse effect for the pull trigger button
if (gameActive && selectedChamber) {
pullTriggerBtn.alpha = 0.7 + Math.sin(LK.ticks / 10) * 0.3;
pullTriggerBtn.setStyle({
fill: 0xff0000,
size: 100
});
} else {
pullTriggerBtn.alpha = 0.5;
pullTriggerBtn.setStyle({
fill: 0xD3D3D3,
size: 100
});
}
// Spin button visibility
if (gameActive && !spinningCylinder) {
spinBtn.alpha = 1;
} else {
spinBtn.alpha = 0.5;
}
};
// Mouse or touch events
game.down = function (x, y, obj) {
// Handle global down events
};
game.up = function (x, y, obj) {
// Handle global up events
};
// Initialize the game
setupGame();